[Laravel] Gửi Email, hướng dẫn cách làm chức năng gửi Email trong Laravel 5

Đăng bởi: Admin | Lượt xem: 4554 | Chuyên mục: Laravel

Trong các trang Web thông thường chúng ta thường sử dụng chức năng gửi Email khi đăng ký tài khoản, khi quên mật khẩu hoặc phản hồi về trang web. Vì vậy chức năng gửi Email là một chức năng không thể thiếu cho Website. Bài viết này vncoder.vn sẽ hướng dẫn các bạn chi tiết cách làm chức năng gửi Email trong Laravel 5.


Trong bài này, chúng ta sẽ khám phá Mail API trong Laravel Framwork. Laravel tận dụng thư viện phổ biến SwiftMailer, điều này dễ dàng sử dụng và có nhiều email driver để chọn lựa. Ở những phần sau của bài viết, chúng ta sẽ đi vào chi tiết của một minh hoạ cho các khái niệm được thảo luận trong nửa phần đầu của bài viết.

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

Laravel triển khai một wrapper trên cùng của thư viện SwiftMailer để giúp việc quản lý email dễ dàng để cấu hình và sử dung cùng một lúc. Bạn có thể tìm thấy thiết lập mail mặc định ở 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", "sendmail", "mailgun", "mandrill", "ses",
    |            "sparkpost", "log", "array"
    |
    */
 
    'driver' => env('MAIL_DRIVER', 'sendmail'),
 
    /*
    |--------------------------------------------------------------------------
    | 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.mailgun.org'),
 
    /*
    |--------------------------------------------------------------------------
    | 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' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
        'name' => env('MAIL_FROM_NAME', 'Example'),
    ],
 
    /*
    |--------------------------------------------------------------------------
    | 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' => env('MAIL_USERNAME'),
 
    'password' => env('MAIL_PASSWORD'),
 
    /*
    |--------------------------------------------------------------------------
    | 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',
 
    /*
    |--------------------------------------------------------------------------
    | Markdown Mail Settings
    |--------------------------------------------------------------------------
    |
    | If you are using Markdown based email rendering, you may configure your
    | theme and component paths here, allowing you to customize the design
    | of the emails. Or, you may simply stick with the Laravel defaults!
    |
    */
 
    'markdown' => [
        'theme' => 'default',
 
        'paths' => [
            resource_path('views/vendor/mail'),
        ],
    ],
 
];

Khi nói đến gửi mail, Laravel hỗ trợ nhiều driver khác để chọn lựa. Như bạn thấy, mặc định MAIL_DRIVER được xét thành SMTP.

Nếu bạn dự định sử dụng driver SMTP để gửi mail vậy bạn cũng cần phải thiết lập những cấu hình như MAIL_HOST, MAIL_PORT, MAIL_ENCRYPTION, MAIL_USERNAME, MAIL_PASSWORD.

Mặt khác, nếu bạn dự tính sử dụng driver sendmail, vậy bạ n muốn bảo đảm rằng đường dẫn hệ thống sendmail được xét đúng giá trị trong file config/mail.php.

Bạn cũng có thể xét địa chỉ from sẽ được dùng khi gửi mail cho khoá from. Và sau cùng, nếu bạn muốn dùng cách tạo email theo định dạng Markdown, bạn có thể xét những cấu hình này qua khoá markdown.

Điểm tốt nhất là bạn thể sử dụng những nhà cung cấp dịch vụ email của bên thứ ba như Mailgun, Mandrill, SES, và SparkPost. Nếu bạn đang dùng một trong số những dịch vụ đó, bạn cần bảo đảm rằng bạ thiết lập những cấu hình tương ứng trong file config/services.

Vậy đó là giới thiệu sơ lược về các thiết lập có liên quan đến mail API trong Laravel. Từ phần tiếp theo trở đi, chúng tôi sẽ vào chi tiết một ví dụ trình bày cho bạn làm sao để gửi các email.

Xây dựng class Mailable

Trong phần này, chúng ta sẽ tạo ra class mailable, nó được dùng để gửi email. Class mailable đảm nhận trách nhiệm cho việc gửi email sử dụng một mailer, mailer này được cấu hình trong file config/mail.php

Trên thực tế, Laravel đã cung cấp một lệnh artisan cho phép chúng ta tạo một template cơ bản.

php artisan make:mail DemoEmail

Nó tạo một template email mới hoàn toàn ở app/Mail/DemoEmail.php, như hiển thị trong đoạn code dưới đây:

<?php
 
namespace App\Mail;
 
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
 
class DemoEmail 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');
    }
}

Hãy thay nội dung của file đó với nội dung sau đây:

<?php
 
namespace App\Mail;
 
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
 
class DemoEmail extends Mailable
{
    use Queueable, SerializesModels;
     
    /**
     * The demo object instance.
     *
     * @var Demo
     */
    public $demo;
 
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($demo)
    {
        $this->demo = $demo;
    }
 
    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from('sender@example.com')
                    ->view('mails.demo')
                    ->text('mails.demo_plain')
                    ->with(
                      [
                            'testVarOne' => '1',
                            'testVarTwo' => '2',
                      ])
                      ->attach(public_path('/images').'/demo.jpg', [
                              'as' => 'demo.jpg',
                              'mime' => 'image/jpeg',
                      ]);
    }
}

Có hai phương thức quan trọng trong class mailable được triển khai - __construct và build. Phương thức __construct được dùng để khởi tạo đối tượng bạn sẽ dùng trong template email. Mặt khác, phương thức build được dùng để khởi tạo thêm các giá trị cụ thể của email như from, template cho view, attachments (file đính kèm) và các thứ tương tự.

Trong trường hợp của chúng ta, chúng ta đã truyền đối tượng $demo thành tham số của constructor, và gán thuộc tính public cho demo.

Trong phương thức build, chúng tôi đã khởi tạo cấu hình email đặc trưng.

  • From được sử dụng để xét địa chỉ email được sử dụng như địa chỉ from.
  • Sử dụng phương thức view, bạn có thể xét email template để sử dụng khi gửi email với mailable. Trong trường hợp của chúng ta, xét nó thành mails.demo, và có nghĩa là bạn cần phải tạo ra một file view template trong resources/views/mails/demo.blade.php.
  • Tiếp theo, phương thức text được dùng để thiết lập phiên bản chỉ chứa text của một email template.
  • Nhưng chúng tôi đã thảo luận, phương thức __construct được dùng để thiết lập các đối tượng sẽ được dùng trong email template, bạn có thể đồng thời dùng phương thức with cho phép bạn thiết lập dữ liệu của view cho một thông điệp.
  • Tiếp theo, chúng ta sử dụng phương thức attach để đính kèm một hình ảnh với một thông điệp,

Dĩ nhiên, chúng ta cần tạo những email template mà chúng ta cần để gửi email. Tiếp điến tạo một file resources/views/mails/demo.blade.php như hiển thị trong phần code bên dưới.

Hello <i>{{ $demo->receiver }}</i>,
<p>This is a demo email for testing purposes! Also, it's the HTML version.</p>
 
<p><u>Demo object values:</u></p>
 
<div>
<p><b>Demo One:</b>&nbsp;{{ $demo->demo_one }}</p>
<p><b>Demo Two:</b>&nbsp;{{ $demo->demo_two }}</p>
</div>
 
<p><u>Values passed by With method:</u></p>
 
<div>
<p><b>testVarOne:</b>&nbsp;{{ $testVarOne }}</p>
<p><b>testVarTwo:</b>&nbsp;{{ $testVarTwo }}</p>
</div>
 
Thank You,
<br/>
<i>{{ $demo->sender }}</i>

Đồng thời, hãy tạo một phiên bản chỉ chứa text của file đó ở resources/views/mails/demo_plain.blade.php.

Hello {{ $demo->receiver }},
This is a demo email for testing purposes! Also, it's the HTML version.
 
Demo object values:
 
Demo One: {{ $demo->demo_one }}
Demo Two: {{ $demo->demo_two }}
 
Values passed by With method:
 
testVarOne: {{ $testVarOne }}
testVarOne: {{ $testVarOne }}
 
Thank You,
{{ $demo->sender }}

Vậy đó là class mailable theo như ý của bạn, và chúng ta vẫn chưa xong khi cần sử dụng facade Mail để thực sự gửi email đi. Trong phấn tiếp theo, chúng ta sẽ khám phá cách bạn có thể dùng Facade Mail để gửi email sử dụng DemoEmail của class Mailable vừa được tạo ra trong phần này.

Kết luận

Trong phần này, chúng ta sẽ tạo một ví dụ để minh hoạ cách bạn có thể dùng class Mailable đã được tạo ra trong phần trước.

Hãy tạo một controller ở app/Http/Controllers/MailController.php với nội dung bên dưới:

<?php
namespace App\Http\Controllers;
 
use App\Http\Controllers\Controller;
use App\Mail\DemoEmail;
use Illuminate\Support\Facades\Mail;
 
class MailController extends Controller
{
    public function send()
    {
        $objDemo = new \stdClass();
        $objDemo->demo_one = 'Demo One Value';
        $objDemo->demo_two = 'Demo Two Value';
        $objDemo->sender = 'SenderUserName';
        $objDemo->receiver = 'ReceiverUserName';
 
        Mail::to("receiver@example.com")->send(new DemoEmail($objDemo));
    }
}

Chú ý rằng chúng tôi đã kèm thêm Facade Illuminate\Support\Facades\Mail sẽ được dùng để gửi email đi. Trong phương thức send, phần khai báo sau đây sẽ đảm nhận việc gửi email bằng cách khởi tạo App\Mail\DemoEmail  Mailable ngay lúc đầu.

Mail::to("receiver@example.com")->send(new DemoEmail($objDemo));

Phương thức to của Facade Illuminate\Support\Facades\Mail trả về một instance của class \Illuminate\Mail\PendingMail , nó đã chứa một mailer được cấu hình thích hợp trong file config/mail.php.

Và cuối cùng, chúng tôi dùng phương thức send của class \Illuminate\Mail\PendingMail để thực sự gửi đi một email.

Để kiểm tra, hãy thêm vào một route trong file routes/web.php.

// Email related routes
Route::get('mail/send', 'MailController@send');

Và với route đó, bạn có thể chạy URL http://your-laravel-site.com/mail/send để xem liệu nó có hoạt động như bạn mong đợi.

Ở mặt khác, nếu bạn muốn kiểm tra email template một cách nhanh chóng, mà không cần phải gửi những email thực sự, thì vẫn có một điều khoản trong Laravel cho phép bạn ghi nhật ký tất cả email gửi đi.

Để thực hiện điều đó, bạn cần phải xét giá trị của MAIL_DRIVER thành log trong file config/mail.php. Tiếp theo, bạn có thể chạy URL đã đề cập và xem xét file log để kiểm tra xem liệu email template có được ghi nhật ký lại ở đó không.

Nếu mọi thứ ổn thoã, bạn sẽ thấy một email đang đã được ghi nhận lại trong file storage/logs/laravel.log.

Cho đến giờ vậy là khá nhiều về tính năng mail trong Laravel, cũng như là phần kết cho bài viết này.

Tổng kết

Hôm nay, chúng ta đã đi chi tiết vào mail API được xây dựng trong Laravel, và nó cũng hỗ trợ một số driver khác.

Bắt đầu với những khái niệm cơ bản, chúng ta đã triển khai class mailable, là một thành phần chủ chốt trong mail API của Laravel khi chúng ta đi tiếp. Cuối cùng, chúng ta đã kiếm tra class mailable bằng cách tạo ra một controller để xem nếu nó thực sự hoạt động.

Nếu bạn chỉ vừa khởi đầu với Laravel hoặc tìm kiếm để mở rộng kiến thức, trang web, hoặc ứng dụng của bạn với các phần mở rộng, chúng tôi có rất nhiều thứ bạn có thể học được trên Envato Market.

Nếu có thắc mắc hay câu hỏi gì các bạn có thể để lại bình luận bên dưới. Chúc các bạn thành công!

Tài liệu tham khảo

vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!



Khóa học liên quan

Khóa học: Laravel

Xây dựng ứng dụng với Laravel và Vuejs
Số bài học:
Lượt xem: 15880
Đăng bởi: Admin
Chuyên mục: Laravel

Học lập trình Laravel
Số bài học:
Lượt xem: 22871
Đăng bởi: Admin
Chuyên mục: Laravel