Như chúng ta biết thì gửi email là một tính năng rất quan trọng cho việc lập trình web. Vì vậy,  laravel đã cung cấp cho chúng ta gửi mail bằng phương thức STMP.Bài viết ngày hôm nay mình sẽ giới thiệu cho các bạn về tính năng hữu ích này.

Send Email trong Laravel

Giới thiệu Laravel Queues

Queues Laravel cung cấp tích hợp nhiều loại hàng đợi khác nhau như Beanstalkd, Amazon SQS, Redis, đồng bộ (đồng bộ hóa) và cơ sở dữ liệu. Bạn có thể tìm thấy các cấu hình hàng đợi trong file config/queue.php.(Mình sẽ giới thiệu ở bài tiếp theo)

Thiết lập những điều kiện ban

Trước hết bước đầu tiên ta phải config lại để project có thể kết nối đến Email.

*Sửa file .env

 Bạn hãy mở file .env lên và tìm dòng tương ứng rồi sửa lại nhé, nếu không có thì bạn ghi thêm vào là được.

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=apppassword
MAIL_ENCRYPTION=tls

Với Gmail thì ta sẽ sử dụng phương thức gửi mail là smtp, host của gmail là smtp.gmail.com, cổng để kết nối đến gmail là 587,

MAIL_USERNAME chính là gmail của bạn và bạn cần phải thay [email protected] = gmail của bạn nhé . MAIL_PASSWORD chính là mật khẩu của gmail bạn vừa nhập

Nếu bạn không dùng file .env thì bạn có thể sửa file config của laravel , bạn vào đường dẫn /config/mail.php

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Mail Driver
    |--------------------------------------------------------------------------
    |
    | Laravel supports both SMTP and PHP's "mail" function as drivers for the
    | sending of e-mail. You may specify which one you're using throughout
    | your application here. By default, Laravel is setup for SMTP mail.
    |
    | Supported: "smtp", "mail", "sendmail", "mailgun", "mandrill",
    |            "ses", "sparkpost", "log"
    |
    */

    'driver' => env('MAIL_DRIVER', 'smtp'),

    /*
    |--------------------------------------------------------------------------
    | SMTP Host Address
    |--------------------------------------------------------------------------
    |
    | Here you may provide the host address of the SMTP server used by your
    | applications. A default option is provided that is compatible with
    | the Mailgun mail service which will provide reliable deliveries.
    |
    */

    'host' => env('MAIL_HOST', 'smtp.gmail.com'),

    /*
    |--------------------------------------------------------------------------
    | SMTP Host Port
    |--------------------------------------------------------------------------
    |
    | This is the SMTP port used by your application to deliver e-mails to
    | users of the application. Like the host we have set this value to
    | stay compatible with the Mailgun e-mail application by default.
    |
    */

    'port' => env('MAIL_PORT', 587),

    /*
    |--------------------------------------------------------------------------
    | Global "From" Address
    |--------------------------------------------------------------------------
    |
    | You may wish for all e-mails sent by your application to be sent from
    | the same address. Here, you may specify a name and address that is
    | used globally for all e-mails that are sent by your application.
    |
    */

    'from' => ['address' => '[email protected]', 'name' => 'visitor'],

    /*
    |--------------------------------------------------------------------------
    | E-Mail Encryption Protocol
    |--------------------------------------------------------------------------
    |
    | Here you may specify the encryption protocol that should be used when
    | the application send e-mail messages. A sensible default using the
    | transport layer security protocol should provide great security.
    |
    */

    'encryption' => env('MAIL_ENCRYPTION', 'tls'),

    /*
    |--------------------------------------------------------------------------
    | SMTP Server Username
    |--------------------------------------------------------------------------
    |
    | If your SMTP server requires a username for authentication, you should
    | set it here. This will get used to authenticate with your server on
    | connection. You may also set the "password" value below this one.
    |
    */

    'username' => '[email protected]',

    /*
    |--------------------------------------------------------------------------
    | SMTP Server Password
    |--------------------------------------------------------------------------
    |
    | Here you may set the password required by your SMTP server to send out
    | messages from your application. This will be given to the server on
    | connection so that the application will be able to send messages.
    |
    */

    'password' => 'apppass',

    /*
    |--------------------------------------------------------------------------
    | Sendmail System Path
    |--------------------------------------------------------------------------
    |
    | When using the "sendmail" driver to send e-mails, we will need to know
    | the path to where Sendmail lives on this server. A default path has
    | been provided here, which will work well on most of your systems.
    |
    */

    'sendmail' => '/usr/sbin/sendmail -bs',
    'pretend' => false,
    ];

 

Bạn tìm dòng tương ứng và sửa lại cho hợp lý nhé chỉ cần thay email và password của bạn là được

*Tạo class Mailable 

Các bạn hãy thêm đoạn code bên dưới trong terminal

php artisan make:mail MailNotify

Khi lệnh trên được chạy xong, một thư mục mới có tên Mail cùng với tệp lớp MailNotify sẽ được tạo trong thư mục ứng dụng.

<?php

namespace App\Mail;
 
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
 
class MailNotify extends Mailable
{
    use Queueable, SerializesModels;
 
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
 
    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('view.name');
        //here is your blade view name
    }
}

 

 *Tạo Route & blade view

Các bạn tạo  1 route :

Route::get('laravel-send-email', '[email protected]');

Và 1 blade view, ví dụ mình tạo 1 view email.blade.php như sau:

DOCTYPE html>
<html>
<head>
 <title>Laravel Send Email Exampletitle>
head>
<body>
 
 <h1>This is test mail from ABCh1>
 <p>Thank you, {{ $user->name }}p>
 
body>
html> 

Lưu ý : Ở đây mình chỉ giới thiệu  về cách hoạt động gửi Mail trên class có sẵn của laravel hỗ trợ, chứ mình ko đi sâu vào việc thiết kế 1 giao diện 1 chức năng gửi mail hoàn chỉnh cheeky

*Tạo Controller & Method

Tiếp theo các bạn mở terminal lên và gõ đoạn code  bên dưới để tạo EmailController

php artisan make:controller EmailController

Các bạn di chuyển tới app/Http/Controllers/EmailController.php và thêm đoạn code bên dưới vào nhé.

<?php

namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use Redirect,Response,DB,Config;
use Mail;
class EmailController extends Controller
{
    public function sendEmail()
    {
      $user = auth()->user();
      Mail::to($user)->send(new MailNotify($user));
 
      if (Mail::failures()) {
           return response()->Fail('Sorry! Please try again latter');
      }else{
           return response()->success('Great! Successfully send in your mail');
         }
    }
}

 

*Chạy và test kết quả 

Bây giờ các bạn ra bên ngoài trình duyệt của mình theo đường dẫn:

http://localhost:8080/laravel-send-email

Vì đường dẫn localhost của mình ở cổng 8080 nên các bạn chú ý đổi đường dẫn trình duyệt của các bạn nhé, thường là cổng 80 .Vậy là xong nhé!

Tổng kết

 Mình vừa hướng dẫn các bạn 1 ví dụ đơn giản về việc gửi mail thông qua việc sử dụng class mailable có sẵn của laravel. Lưu ý các bạn là nên tắt chức năng bảo vệ 2 lớp của gmail đi nhé thì các bạn mới test được. Chúc các bạn thành công và nhớ theo dõi các bài viết tiếp theo nhé.