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
.
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);
}
}
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.
Originally published at www.laravel.web.id on November 30, 2017.