Gửi mail bằng Queue trong Laravel

135

Chào các bạn,

Ở phần trước, chúng ta đã tìm hiểu về Queue trong Laravel. Tiếp tục phần này, để hiểu hơn thì mình sẽ thực hiện Demo gửi mail sử dụng Queue nhé.

I. Cấu hình gửi mail bằng mailtrap.io

1.1 Đăng ký tài khoản mailtrap.io

Mailtrap.io cung cấp dịch vụ giả lập một máy chủ SMTP, chuyên dùng để test, hoặc phát triển các tính năng liên quan tới việc gửi mail. Email được gửi bằng dịch vụ của mailtrap.io sẽ không đi vào inbox của người nhận, mà đi vào inbox của mailtrap – nhờ đó mà người nhận không bị spam bởi những email mà bạn gửi trong lúc test, phát triển sản phẩm.

Tài khoản mailtrap.io có thể đăng ký dễ dàng bằng tài khoản github hoặc tài khoản google (gmail).

Sau khi đăng ký thành công, bạn sẽ được chuyển hướng vào trang danh sách các inbox. Mặc định, mailtrap.io tạo trước cho bạn một inbox có tên là Demo inbox. Bạn nhấn chuột vào biểu tượng mà mình khoanh đỏ ở trong hình, để xem tới trang xem chi tiết.

Tới trang chi tiết, bạn hãy để ý cho mình các thông tin về SMTP như hình dưới đây

Đây sẽ là các thông tin mà bạn cần trong bước tiếp theo. Đặc biệt hai thông tin UsernamePassword bạn nhớ đừng để lộ cho ai nhé.

1.2 Cấu hình Laravel sử dụng mailtrap.io

Mở file .env, tìm các thông tin sau và sửa thành:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=mailtrap_port
MAIL_USERNAME=mailtrap_username
MAIL_PASSWORD=mailtrap_password
MAIL_ENCRYPTION=tls

Nhớ phải thay mailtrap_port, mailtrap_username, mailtrap_password bằng các thông tin của bạn nhé.

II. Thực hiện demo gửi mail bằng Queue

Giờ mình sẽ thực hiện demo gửi 20 email một lúc, để xem tốc độ gửi mail bằng queue như thế nào, có nhanh hay không.

Demo này được mình thực hiện trên Laravel 5.5, các phiên bản Laravel cũng tương tự.

2.1 Tạo các thứ cần thiết

Các bạn chạy lần lượt các command dưới đây để tạo các thứ cần thiết cho demo.

php artisan make:controller MailController
php artisan make:mail TestMail
php artisan make:job SendEmail

Mở App\Mail\TestMail, xóa hết toàn bộ nội dung và thay bằng:

<?php

namespace App\Mail;

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

class TestMail extends Mailable
{
    use Queueable, SerializesModels;

    public function build()
    {
        return $this
            ->from('[email protected]')
            ->view('mails.test');
    }
}

Tạo file resources/views/mails/test.blade.php với nội dung:

<p>Test message</p>

Mở App\Jobs\SendEmail xóa hết nội dung và thay thế bằng:

<?php

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 Mail;

class SendEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $mail;

    public function __construct($mail)
    {
        $this->mail = $mail;
    }

    public function handle()
    {
        Mail::send($this->mail);
    }
}

Mở App\Http\Controllers\MailController xóa hết nội dung và thay thế bằng:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Jobs\SendEmail;
use App\Mail\TestMail;

class MailController extends Controller
{
    public function test()
    {
        $startTime = microtime(true);

        for ($i = 0; $i < 20; $i++) {
            $testMail = new TestMail();
            $sendEmailJob = new SendEmail($testMail);
            dispatch($sendEmailJob);
        }

        $endTime = microtime(true);
        $timeExecute = $endTime - $startTime;

        return "Done. Time execute: $timeExecute";
    }
}

Mở routes/web.php, thêm route sau:

<?php
// ...
Route::get('/test', '[email protected]');

2.2 Demo

Trước khi thực hiện demo, hãy nhớ là bạn phải cấu hình Queue như mình hướng dẫn ở bài trước nhé.

Khởi động queue bằng command sau:

php artisan queue:work

Khởi động Laravel serve bằng command sau:

php artisan serve

Sau đó truy cập vào: http://localhost:8000/test để bắt đầu gửi mail bằng queue.

Khi truy cập vào link trên, bạn sẽ nhận được phản hồi ngay lập tức mà không cần phải đợi lâu. Khi đó các Job gửi mail đã được đưa vào Queue và đang chờ để thực hiện, bạn có thể quay trở lại terminal – nơi đang chạy lệnh queue:work để thấy tiến trình các Job đang chạy. Cứ mỗi Job chạy thành công, thì ở bên mailtrap.io bạn sẽ nhìn thấy một mail mới. Bạn cũng có thể xem nhanh bằng video của mình dưới đây.

III. Kết luận

Đây là một demo đơn giản, chủ yếu để các bạn biết cách sử dụng Queue cũng như thấy được Queue chạy ngầm là như thế nào. Trong các dự án, việc gửi email cũng rất thường xuyên xảy ra, nên bạn có thể bookmark lại bài viết này của mình, để khi cần thì sẽ có tài liệu hướng dẫn ngay :p.

Cảm ơn các bạn đã theo dõi.

Bài viết được viết dựa trên kinh nghiệm cá nhân, rất mong nhận được góp ý của tất cả các bạn.