Bila anda mengikut tutorial yang ada di Mengirim Email dengan Mailables di Laravel 5.4, anda tentu merasa proses pendaftaran user baru terasa lambat, karena disitu juga Laravel langsung mengirim email notifikasi. Solusinya adalah dengan menggunakan queue (antrian) yang sudah menjadi bawaan standart Laravel.

Contoh mengirim email di Laravel 5.6 ditambah dengan queue

Install Laravel 5.6

Disini saya akan menggunakan Laravel 5.6. Buat project baru

composer create-project --prefer-dist laravel/laravel laravel

Pindah ke direktori laravel yang baru dibuat, lalu install guzzle

cd laravel;
composer require guzzlehttp/guzzle

Setting .env

yang perlu anda ubah di .env adalah bagian dibawah ini, sesuaikan database anda dan juga username/password dari mailtrap.io

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=null
 
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

satu lagi yang wajib adalah ubah QUEUE_DRIVER=sync menjadi QUEUE_DRIVER=database

Generate queue table dan authentikasi

php artisan queue:table
php artisan make:auth

lalu jalankan migrate agar database tersebut dimasukkan kedalam database.

php artisan migrate

Bila kita mengakses http://localhost/laravel/public/, kita sudah bisa membuat akun baru
laravel new page

Tiap user yang mendaftar kita akan mengirim email ke alamat email yang didaftarkan.

Membuat mailable

Kita akan membuat mailable untuk mengirim email ke orang yang mendaftar disitus Laravel yang kita buat.

php artisan make:mail PendaftaranUser

perintah diatas akan menggenerate template standart untuk mengirim email. Letaknya ada di folder app/Mail/. Ubah PendaftaranUser.php menjadi

<?php
 
namespace App\Mail;
 
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
 
class PendaftaranUser extends Mailable {
	use Queueable, SerializesModels;
	public $user;
	/**
	 * Create a new message instance.
	 *
	 * @return void
	 */
	public function __construct($user) {
		$this->user = $user;
	}
 
	/**
	 * Build the message.
	 *
	 * @return $this
	 */
	public function build() {
		return $this->view('email.pendaftaranuser');
	}
}

template email yang dikirim akan kita simpan di folder resources/views/email. Buat file pendaftaranuser.blade.php di folder tersebut yang isinya

Hai, {{ $user->name }},<br>
 
terimakasih telah bergabung bersama <a href="https://jaranguda.com">jaranguda.com</a>

Ubah RegisterController.php

Ubah file app/Http/Controllers/Auth/RegisterController.php menjadi

<?php
 
namespace App\Http\Controllers\Auth;
 
use App\Http\Controllers\Controller;
use App\Mail\PendaftaranUser;
use App\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Validator;
 
class RegisterController extends Controller {
	/*
		    |--------------------------------------------------------------------------
		    | Register Controller
		    |--------------------------------------------------------------------------
		    |
		    | This controller handles the registration of new users as well as their
		    | validation and creation. By default this controller uses a trait to
		    | provide this functionality without requiring any additional code.
		    |
	*/
 
	use RegistersUsers;
 
	/**
	 * Where to redirect users after registration.
	 *
	 * @var string
	 */
	protected $redirectTo = '/home';
 
	/**
	 * Create a new controller instance.
	 *
	 * @return void
	 */
	public function __construct() {
		$this->middleware('guest');
	}
 
	/**
	 * Get a validator for an incoming registration request.
	 *
	 * @param  array  $data
	 * @return \Illuminate\Contracts\Validation\Validator
	 */
	protected function validator(array $data) {
		return Validator::make($data, [
			'name' => 'required|string|max:255',
			'email' => 'required|string|email|max:255|unique:users',
			'password' => 'required|string|min:6|confirmed',
		]);
	}
 
	/**
	 * Create a new user instance after a valid registration.
	 *
	 * @param  array  $data
	 * @return \App\User
	 */
	protected function create(array $data) {
		$user = User::create([
			'name' => $data['name'],
			'email' => $data['email'],
			'password' => bcrypt($data['password']),
		]);
		\Mail::to($data['email'])->send(new PendaftaranUser($user));
		return $user;
	}
}

Coba buat akun baru, lalu cek inbox anda di mailtrap
pendaftaran user baru

Membuat Queue

Agar aplikasi web yang kita buat lebih responsive ada baiknya proses pengiriman email kita jalankan dibackground, jadi user akan merasa proses pendaftarannya lebih cepat karena tidak ada jeda dalam pengiriman email.

Cara standart untuk mengirim email ke queue, cukup mengubah send() menjadi queue(), sehingga function create() di RegisterController.php menjadi

	protected function create(array $data) {
		$user = User::create([
			'name' => $data['name'],
			'email' => $data['email'],
			'password' => bcrypt($data['password']),
		]);
		\Mail::to($data['email'])->queue(new PendaftaranUser($user));
		return $user;
	}

sebelum membuat akun baru, jalankan dari command line

php artisan queue:work

Coba buat akun baru, nanti di terminal anda akan muncul kira-kira

[2018-02-23 14:59:59][1] Processing: App\Mail\PendaftaranUser
[2018-02-23 15:00:02][1] Processed: App\Mail\PendaftaranUser

semua proses queue tersebut dimasukkan kedalam tabel jobs di database

Sampai disini usai sudah proses penggunaan queue mail di Laravel 5.6

Join the Conversation

2 Comments

Your email address will not be published. Required fields are marked *