Send Email using Queue in Laravel 5.8

Send Email using Queue in Laravel 5.8

Gửi Email là một trong những yêu câu mà người dùng thường sử dụng trong các website thương mại điện tử. Nay mình dùng một chức năng Send Email Queue trong Laravel 5.8

# Setup Laravel 5.8

composer create-project --prefer-dist laravel/laravel blog "5.8.*"

# Create Email in Laravel 

php artisan make:mail SendEmailDemo

Ta sẽ nhìn thấy một thư mục Mail trong project của ta cùng với file SendEmailDemo.php, ta cần cấu hình file như sau:

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

class SendEmailDemo extends Mailable
{
    use Queueable, SerializesModels;
    protected $details;
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($details)
    {
        $this->details = $details;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('testemail')->with("details",$this->details);
    }
}

Bạn nhìn thấy mình, chổ hàm build() mình return về view('testemail'), bạn tạo cho mình file testemail.blade.php trong thư mục Views

<div style="border:1px solid red;border-radius:5px;padding:10px;box-size:border-box;">
	<h1>{{$details['title']}} - hoanguyenit.com<h1>
	<span style="font-size:13px">{{$details['email']}}</span>
	<p style="font-size:15px;line-height:25px;">
		{{$details['body']}}
	</p>
</div>

# Configuration Queue

Ta mở file .env lên cấu hình như sau:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=email@gmail.com
MAIL_PASSWORD=password
MAIL_ENCRYPTION=tls
QUEUE_CONNECTION=database

Cấu hình file .env xong, ta chạy câu lệnh bên dưới, sẽ tạo cho ta một table jobs trong database, sẽ chứa các hàng đợi, khi ta gửi một email, nó sẽ lưu vào table này

php artisan queue:table
php artisan migrate

# Create Queue Job

php artisan make:job SendEmailJob

Chạy câu lệnh bên trên sẽ tạo ra một file SendEmailJob.php nằm trong thư mục App\Jobs\SendEmailJob.php
Ta mở file và thêm use App\Mail\SendEmailDemo.php vào file

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Mail\SendEmailDemo;
use Mail;
class SendEmailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    protected $details;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($details)
    {
        $this->details = $details;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $email = new SendEmailDemo($this->details);
        Mail::to($this->details['email'])->send($email);
    }
}

# Create File Controller

php artisan make:controller EmailController --resource

Ta tạo file EmailController.php trong thư mục App\Http\Controller và thêm use App\Jobs\SendEmailJob vào file, đồng thời ta cấu hình hàm store(Request $request) kiểm tra form nhập gửi mail.
Bạn nhìn thấy dispatch(new SendEmailJob($details)) nó sẽ được gọi và gửi dữ liệu tới SendEmailJob->SendEmailDemo. Tại SendEmailDemo nó sẽ đưa dữ liệu ra template testemail.blade.php để gửi cho người dùng

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Jobs\SendEmailJob;
class EmailController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return View('email');
    }
    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'title' => 'required|max:255',
            'body' => 'required',
        ]);
        if($validatedData){
            $details=[
                "email"=>"thanhhoacth2013@gmail.com",
                "title"=>$request->title,
                "body"=>$request->body
            ];
            dispatch(new SendEmailJob($details));
            return redirect()->route('email.index');
        }
     
    }
}

# Create file View Blade

Vào thư mục View->tạo file email.blade.php, chúng ta thiết kế giao diện nhập thông tin gửi email 

//email.blade.php 
@extends('layouts.app')
@section('content')

<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-4">
        <h2>Send Email using Laravel 5.8</h2>
        @if ($errors->any())
            <div class="alert alert-danger">
                <ul>
                    @foreach ($errors->all() as $error)
                        <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
        @endif
            <form action="{{route('email.store')}}" method="post">
            @csrf
                <div class="form-group">
                    <label for="title">Title</label>
                    <input type="text" name="title" placeholder="Title" class="form-control"/>
                </div>
                <div class="form-group">
                    <label for="body">Body</label>
                    <input type="text" name="body" placeholder="Body" class="form-control"/>
                </div>
                <div class="form-group">
                    <input type="submit" name="submit" value="Send Email" class="btn btn-success"/>
                </div>
            </form>
        </div>
        <div class="cold-md-8">
            <div id="calendar"></div>
        </div>
    </div>
</div>
@endsection

# Configuration Route

Vào thư mục Routes/web.php và chỉnh sửa routes như code bên dưới 

Route::prefix('email')->group(function () {
    Route::get('/','EmailController@index')->name('email.index');
    Route::post('/email','EmailController@store')->name('email.store');
});

# Test Send Email using Queue

Bạn mở 2 cửa sổ command và chạy câu lệnh bên dưới xong, gõ trên trình duyệt http://localhost:8000/email để test , bạn có thể nhìn các tiến trình chạy trong command 1

command 1: php artisan queue:listen
command 2: php artisan serve

send email using queue in laravel 5.8send email using queue in laravel 5.8send email using queue in laravel 5.8