Send mail trong Laravel với Mailgun

Send mail trong Laravel với Mailgun hướng dẫn bạn cách thức gửi mail từ trong Laravel sử dụng dịch vụ MailGun.

Send mail trong Laravel

Trong Laravel có thể gửi mail theo nhiều cách (driver) khác nhau như SMTP, Mailgun, Postmark, Amazon SES …Bạn có thể gửi các transaction mail (mail giao dịch) như Postmark hoặc các mail với số lượng lớn (mattketing, thông báo khách hàng) như Amazon SES…

Các driver dựa trên API như Mailgun, Postmark thường đơn giản và nhanh hơn SMTP server, nên dùng các driver này. Sau đây là các bước hướng dẫn sử dụng mailgun, bao gồm:

  1. Đăng ký mailgun và lấy domain, api key
  2. Cấu hình sử dụng mailgun
  3. Cài gói  Symfony Mailer
  4. Tạo view chưa nội dung mail
  5. Tạo mailable class
  6. Thực hiện gửi mail
  7. Truyền data vào nội dung mail

Đăng ký Mailgun

  • Xong vào Sending => Domains ==> Copy domain của bạn
  • Nhắp API key rồi copy giá trị Private API Key của bạn

Cấu hình sử dụng mailgun

Mở file .env khai báo domain gửi mail và Private API key của bạn

MAILGUN_DOMAIN=Điền Domain name đã copy ở trên
MAILGUN_SECRET=Điền Private API Key đã copy ở trên

Cài gói Symfony Mailer

Cài gói Symfony Mailer để thực hiện gửi mail trong laravel. Chạy lệnh sau:

composer require symfony/mailgun-mailer symfony/http-client

Tạo view chứa nội dung mail

Tạo file views/guimail.blade.php và soạn nội dung (tùy ý) cho mail:

<b>Chào bạn</b>
<p><i>Khỏe không bạn? Chúc an lành! Chúc thành công</i></p>

Trong view nội dung mail, bạn có thể hiện giá trị các biến nếu khi nạp view có truyền data vào

Tạo mailable class

Mailable class là 1 template tạo ra để khai báo thông số cho mail. Lưu trong app/Mail. Lệnh để tạo một mailable class như sau:

php artisan make:mail GuiEmail

Trong file mới tạo bạn sẽ thấy hàm envelope() và hàm content(), nơi đây bạn khai báo thông số tiêu đề thư, địa chỉ người gửi (nên là địa chỉ mail đã đăng ký với mailgun ở trên) , viết lệnh nạp view chứa nội dung mail (đã tạo ở trên)…

public function envelope() {
    return new Envelope(
         from: 'longvn.doivui@gmail.com',
         subject: 'Gui Email',
    );
};

public function content() {
    return new Content(
        view: 'guimail',
   );
}

Thực hiện gửi mail

Gọi hàm send để thực hiện gửi mail nhé. Có thể gọi từ trong controller hoặc viết luôn trong routes/web.php

Ví dụ trong routes/web.php, sử dụng driver mailgun và hàm send để gửi mail như sau:

use App\Mail\GuiEmail;
Route::get("/guimail", function(){
   Mail::mailer('mailgun')
   ->to('diachimail@ngườinhận.com')
   ->send( new GuiEmail() );
});

Mở trình duyệt và gõ:   http://localhost:8000/guimail  

Nếu không có thông báo lỗi hiện ra tức là bạn đã gửi email thành công, ngược lại nếu bạn thấy lỗi, thì xử lý tiếp. Có thể bạn cấu hình sai user, pass, hoặc chưa khai báo email người nhận trong mailgun.

Tại sao cần khai báo email người nhận? Lý do là bạn đang dùng domain sandbox để gửi mail nên bị hạn chế. Bạn cần khai báo trước email người nhận và được người confirm thì gửi OK. Thực hiện như sau:

Khai báo email người nhận trong mailgun

Trong trang quản trị mailgun, vào Sending => Domains => nhắp domain sandbox của bạn rồi khai báo email người nhận (bên cột phải) . Xong thì vào hộp thư nhắp link confirm là xong.

Truyền data vào nội dung mail

Có thể truyền data vào cho mailable sử dụng. Mailable lưu dữ liệu vào biến public và view nội dung mail có thể truy xuất.

Trong views/GuiMail.blade.php , bạn có thể cho hiện các  biến truyền vào

Nhờ việc truyền tham số như vậy, việc send mail trong Laravel với Mailgun rất linh động. Bạn có thể thực hiện gửi mail hàng loạt với nội dung mail khác nhau với theo từng khách hàng.

Xem log gửi mail trong mailgun

Bạn có thể xem Log các mail đã gửi trong mailgun bằng cách nhắp Sendings => chọn Logs.

Sau đó trong từng mail, nhắp mục Quick view để xem nội dung mail

Các cách gửi mail khác

Ngoài mailgun, Laravel còn hỗ trợ nhiều cách gửi mail khác như smtp, postmark…Bạn có thể tham khảo thêm tại đây nhé https://laravel.com/docs/9.x/mail