Mengirim Email dari Aplikasi Berbasis Laravel


Salah satu fitur menarik di Laravel yang tak boleh dilewatkan adalah mail. dengan fitur ini, kita dapat mengirim email langsung dari aplikasi. Agaknya, email memang sebuah fitur yang umumnya harus ada dalam aplikasi berbasis web.

Laravel sendiri menggunakan package yang sudah matang dan ada lebih dulu, yaitu SwiftMailer. Untuk implementasinya, Laravel menyediakan sebuah wrapper (dalam bentuk class) untuk mengakses package SwitfMailer secara tak langsung. Tersedianya wrapper ini juga memungkinkan email dikirim dalam berbagai jenis driver, seperti SMTP atau fungsi mail dalam PHP. Bahkan, memungkinkan pemrogram untuk menggunakan berbagai layanan pihak ketiga seperti Mailgun, SparkPost, Amazon SES, dan lain sebagainya.

perlu diperhatikan, beberapa layanan email pihak ketika membutuhkan Guzzle Client agar dapat bekerja sebagaimana mestinya.

$ composer require guzzle/guzzlehttp

Untuk mengirim email, kita cukup menggunakan facade Mail. Sebelumnya, terlebih dahulu atur konfigurasi SMTP dalam berkas .env.

Mailtrap.io — Fake smtp testing server. Dummy smtp email testing

Sebagai bawaan, Laravel mendefisinakn nilai default berupa SMTP dari Mailtrap.io. Jika ingin mencoba Mailtrap.io, kalian cukup mendaftar untuk mendapatkan username dan password SMTP. Oh ya, Mailtrap.io sendiri merupakan layanan untuk uji coba kotak masuk. Semua email yang dikirim dari aplikasi nantinya dapat diakses pada kotak masuk Mailtrap.io.

Berikut contoh penggunaan sederhana pengiriman email menggunakan Laravel.

public function send() 
{
    $user = User::find(1);

    Mail::send('mails.reminder', ['user' => $user], function($mail) use($user) {
        $mail->from('laravelid@gmail.com', 'Laravel Indonesia');
        $mail->to($user->email, $user->name);
    });
}

Jangan lupa untuk mengimpor facade Mail dari controller.

use Illuminate\Support\Facades\Mail;

// atau cukup ditulis dengan alias
use Mail;

Apabila alamat pengirim tidak didefinisikan menggunakan method from($email, $name), maka datanya otomatis akan diambil dari berkas konfigurasi config/mail.php.

Argumen pertama pada method send() berfungsi untuk mendefinisikan path template Blade. Dalam hal ini, kita harus membuat sebuah berkas Blade dengan nama reminder.blade.php dalam direktori resources/views/mails. Sedangkan argumen kedua pada method tersebut berfungsi untuk melempar variabel ke dalam Blade. Contoh sederhana template email berbasis Blade dapat dilihat pada potongan skrip di bawah.

<h1>Halo, {{ $user->name }}</h1>

<p>Terima kasih telah mendaftar di aplikasi {{ config('app.name) }}.</p>

Selain method from() dan to(), juga terdapat method lain yang dapat digunakan dalam mail.

$message->sender($address, $name = null);
$message->cc($address, $name = null);
$message->bcc($address, $name = null);
$message->replyTo($address, $name = null);
$message->subject($subject);
$message->priority($level);
$message->attach($pathToFile, array $options = []);

// Attach a file from a raw $data string...
$message->attachData($data, $name, array $options = []);

// Get the underlying SwiftMailer message instance...
$message->getSwiftMessage();

Sebagai bawaan, mail berasumsi akan menggunakan template blade yang mengandung HTML. Jika ingin mengirim pesan hanya dalam bentuk teks, kita dapat menggunakan method raw().

Mail::raw('Selamat datang', function($mail){

});

Kita juga dapat mengkombinasikan mail berupa HTML dan teks dalam satu skrip. Hal ini sebagai antisipasi aplikasi email di klien tidak mendukung format HTML.

Mail::send(['html.view', 'text.view'], $data, function($mail){

});

Mailable

Mailable sebenarnya tidak jauh berbeda dengan konsep kirim email di atas. Hanya saja, mailable dibuat berada pada berkas terpisah dalam class khusus. Dengan dipisahkannya proses ini, memungkinkan email dapat digunakan secara berulang (reusable) di berbagai tempat (controller, event, queue, dll). Selain itu, berkas tempat menyimpan proses kirim email dapat dengan mudah diorganisir.

Untuk membuat mailable, kita dapat menjalankan perintah generate dari Artisan.

$ php artisan make:mail UserRegisterMail

Jika perintah di atas berhasil, maka akan dibuat direkoktori baru dengan nama app/Mail dan di dalamnya terdapat sebuah berkas degan nama UserRegisterMail.php.

Dalam berkas UserRegisterMail.php, sudah ada predefined script untuk proses kirim email. Yang perlu kita lakukan adalah memodifikasi skrip tersebut agar dapat mengirim sesuai dengan kebutuhan aplikasi.

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\User;

class UserRegisterMail extends Mailable
{
    use Queueable, SerializesModels;

    protected $user;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->to($this->user->email, $this->user->name)
            ->subject('Selamat datang!')
            ->view('mails.user.register')
            ->with('user', $this->user);
    }
}

Bagian yang saya tandai (highlight), merupakan skrip yang saya tambahkan ke dalam class mailable.

Sebagai contoh, class di atas berfungsi untuk mengirim sebuah email ke pengguna terdaftar dalam pangkalan data. Saya menambahkan properti $user yang nilainya diambil dari __construct() class. Data user ini nantinya akan dilempar dari instance class tersebut.

Jangan lupa untuk membuat template blade dengan nama register.blade.php dalam direktori resources/views/mails/user.

Untuk penggunaan di controller, class UserRegisterMail harus diimpor terlebih dahulu. Kemudian tetap menggunakan facade Mail untuk proses pengiriman.

public function register(Request $request): RedirectResponse
{
    // create new user
    $user = User::create($request->all());

    // send new email to registered user
    Maill::send(new \App\Mail\UserRegisterMail($user));

    return redirect()
        ->back()
        ->withSuccess('User has been registered.');
}

Contoh implementasi mailable dapat kalian coba pada registrasi glosarium.web.id. Tak hanya implementasi, skripnya pun dapat kalian lihat langsung pada repositori web Glosarium.

Tak Berkategori

Yugo Purwanto

Pemrogram PHP dan JavaScript yang sedang sibuk mengembangkan aplikasi Glosarium Bahasa Indonesia.

3 comments

  1. hai, saya mau bertanya
    bagaimana kalau hanya mengirm email untuk user yang sedang login? dan bagaimana jika ada dua property di _construct?
    misal kasusnya begini, user klik tombol beli, lalu email otomatis terkirim untuk menyampaikan rincian produk yang dibeli? kan berarti saya harus ambil email user dan nama produk
    terima kasih

    • Bisa ditambahkan dua paramater dalam __construct.


      __construct(User $user, Product $product) {}

      Penggunaan juga melempar dua argmen.


      send(new OrderMail($user, $product));

Tinggalkan Balasan