Làm thế nào để gửi mail từ ứng dụng Laravel?

Gửi mail cơ bản

Bước 1: Tạo route

Route::get(‘/send-mail’,’MailSenderController@send’);

Bước 2: Thêm template resources/views/emails/template.blade.php

Hi , {{ $name }}
{{ $msgBody}}

Giải thích: ở đây $name$msgBody là 2 biến được truyền vào với tùy từng người nhận và từng hoàn cảnh.

Bước 3: Tạo controller với tên MailSenderController trong app/Http/Controller/

use Illuminate\Support\Facades\Mail;
public function sendMail()
{
    $data = [
        ‘name’ = ‘Alex Gray’
        ‘msgBody’ = ‘Welcome to Deverion’
    ];
    Mail::send(‘emails.template’,$data,function($mail){ 
        $mail->from(‘info@example.com’);
        $mail->to(‘jhon@example.com’);
        $mail->subject(‘Welcome E-mail’);
    });
    return ‘Successfully send’;
}

Chú ý email.template chính là file emails/template.blade.php template đó chứa 2 biến $namemsgBody nên ta sẽ truyền vào $data có chứa 2 tham số đó.
Bước 4: Thêm cấu hình mail trong file .env

    MAIL_DRIVE=smtp 
    MAIL_HOST=[smtp.gmail.com](http://smtp.gmail.com/)
    MAIL_PORT=587
    MAIL_USERNAME=mail_address
    MAIL_PASSWORD=mail_password
    MAIL_ENCRYPTION=tls

Ở đây mail_address và mail_password sẽ là mail dùng để mail . Nếu dùng các dịch vụ mail khác thì sẽ điền vào api_key và api_secret tương ứng được cung cấp bởi các dịch vụ đó như mailgun, mailtrap ,…

Bước 5: Chạy thử
Truy cập your_website/send-mail và kiếm tra mail bạn điền vào trong hàm ở bước 3
Nếu Laravel chưa có sẵn gói guzzle/guzzle-http bạn cần cài thêm để gửi mail bằng câu lệnh

    composer require guzzle/guzzle-http

Nâng cao :

Gửi mail đồng loạt tới nhiều người :

$users = [
   [
    name => “Alex”
    mail => “example-alex@gmail.com”],
   [
    name => “John”
    mail =>  “example-john@gmail.com”
  ]);
for( $i=0; $i<count($users); $i++){
    Mail::send(‘emails.template’,$data,function($mail){
        $mail->from(env(MAIL_ USERNAME));
        $mail->to($users[$i]->mail);
        $mail->subject(‘Welcome Deverion’);
    });
}

Gửi mail với số biến không biết trước
Như ở ví dụ trên template có 2 biến được sử dụng , nếu giờ có 5 loại mail với số biến khác nhau ?
Ở đây mình sử dụng 1 template chung cho tất cả các mail chỉ với 1 dòng duy nhất {!! $content !!}
Database sẽ lưu nội dung $content của mail .
Ví dụ

Hi, $name . Welcome to $organization

Truyền biến vào $content với hàm str_replace

    str_replace($content,$name,”Alex”)
    str_replace($content,$organization,”Deverion”)

Ưu điểm của cách triển khai này:

  • Không lo bị lỗi ở server khi template được truyền thiếu . thừa biến ($name,$organization)
  • Toàn bộ template được lưu ở database nên dễ dàng chỉnh sửa theo ý ( ko bị rang buộc cấu trúc rõ ràng)
3 Likes