Gửi mail trong Laravel với Mailgun

Mailgun là một là dịch vụ gửi nhận mail API rất hay.  Nó cho phép bạn bạn gửi nhận và quản lý email từ website của bạn đến khách hàng.

Đăng ký tài khoản ở mailgun

Vào địa chỉ : https://www.mailgun.com/  rồi nhắp nút Start Sending để đăng ký tài khoản.  Đăng ký và kích hoạt thành công bạn sẽ được chuyển đến trang quản trị Mailgun.

Khai báo domain dùng để gửi mail

Vào mục Sending => Domains để khai báo các domain sẽ dùng để gửi mail. Nếu chỉ gửi test cho biết thì dùng luôn domain sanbox đã tạo sẵn cho bạn, nếu vậy thì ghi domain lại để chút nữa dùng đến.

gui-mail-trong-laravel-voi-mailgun-1

Lấy Private API Key

Nhắp link ở góc phải trên trang Mailgun rồi chọn API keys (xem hình trên) bạn sẽ thấy thông tin Private API Key của mình. Nhắp nút con mắt để hiện đầy đủ rồi copy lại chút nữa dùng.

private-key-mailgun

Cài đặt GuzzleHttp

Để gửi mail trong laravel. bạn cài thêm thư viện GuzzleHttp:

composer require guzzlehttp/guzzle

Cấu hình gửi email trong Laravel

a. Cấu hình file .env

Mở file .env và thêm một số hằng số sau vào cuối file

MAIL_PORT=587
MAIL_DRIVER=mailgun
MAILGUN_DOMAIN=Điền Domainnames đã copy ở trên
MAILGUN_SECRET=Điền Private API Key đã copy ở trên

b. Cấu hình file mail.php

Mở file config/mail.php, trong  mục from khai báo email và tên người gửi

'from' => [
   'address' => env('MAIL_FROM_ADDRESS', 'email@củabạn'),// email gửi
   'name' => env('MAIL_FROM_NAME', 'Tên của bạn'),// tên người gửi mail
 ],

c. Cấu hình file service.php

Mở file config/service.php và thêm đoạn này vào rồi lưu lại

'mailgun' => [
        'domain' => env('MAILGUN_DOMAIN'),
        'secret' => env('MAILGUN_SECRET'),
 ],

Tạo mail mailable class

Mailable class là 1 template bạn cần tạo ra để gửi mail. Chúng được lưu trong folder  app/Mail . Tạo 1 mailable class bằng artisan như sau

php artisan make:mail GuiEmail

Mở file mới tạo, bạn sẽ thấy hàm built, trong đó có lệnh nạp viiew, bạn sửa lại thành tên view chứa nội dung mail muốn nạp.

namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class GuiEmail extends Mailable {
    use QueueableSerializesModels;
    public function __construct() {
        //
    }
    public function build()  {
        return $this->view('guimail');
    }
}

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

Tạo file resources/views/guimail.blade.php (giống tên vừa khai báo trong hàm built ở trên) và soạn nội dung cho mail sắp gửi:

Chào bạn


Khỏe không bạn? Chúc an lành! Chúc thành công

Tạo controller

Tiếp theo bạn tạo controller để gửi mail, nội dung như sau:

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
use Mail;
use App\Mail\GuiEmail;
class GuimailController extends Controller {
    function guimail(){
        $id = 1; 
        $user = User::findOrFail($id);
        Mail::to($user)->send(new GuiEmail());
    }
}

Trong controller khai báo hàm guimail, trong hàm sẽ lấy thông tin của user nào đó trong bảng users để gửi (hàm đang lấy user có id=1, bạn có thể dùng giá trị khác với điều kiện email có thật trên internet nhé). Sau đó dùng hàm send để gửi mail với mailable class là GuiEmail.

Chú ý: để lấy được thông tin từ bảng user, bạn nhớ tạo model user nhé (php artisan make:model…)

Tạo route gửi email

Mở file routes/web.php  và thêm route sau

Route::get('/guimail', "GuimailController@guimail");

Thực hiện gửi mail

Mở trình duyệt và gõ:   http://localhost/website_folder/public/guiemail  

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 sau user, pass… Thường thì lỗi này sẽ hiện ra:

400 BAD REQUEST` response: { "message": "Sandbox subdomains are for test purposes only. Please add your own domain or add the address to authoriz (truncated…

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

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.

gui-mail-trong-laravel-voi-mailgun-them-email