12/08/2018, 10:50

Gửi Email trong Laravel _ Áp dụng với Gmail

Gửi mail là một yếu tố không thể thiếu trong ứng dụng web. Trong một ứng dụng web thông thường, chúng ta sử dụng chức năng gủi mail khi đăng ký mới thành viên, khi quên mật khẩu hay khi phản hổi một vấn đề về trang web mà người dùng gặp phải. Config Email Để gửi được mail trong Laravel, chúng ...

Gửi mail là một yếu tố không thể thiếu trong ứng dụng web. Trong một ứng dụng web thông thường, chúng ta sử dụng chức năng gủi mail khi đăng ký mới thành viên, khi quên mật khẩu hay khi phản hổi một vấn đề về trang web mà người dùng gặp phải.

Config Email

Để gửi được mail trong Laravel, chúng ta cần quan tâm đến file app/config/mail.php. Tất cả cấu hình và cài đặt để gửi được một email đều có trong file này. Các tham số của file như sau:

  • Driver: Config driver bạn muốn dùng để gửi mail. Mặc định của Laravel sẽ dùng SMTP driver. Tuy nhiên bạn cũng có thể thay đổi sang một driver khác.
  • host: Địa chỉ của server SMTP
  • post: Cổng của SMTP.
  • from: Trường này cho phép bạn cài đặt trường from trong email. Tất cả các email đều nhận được từ cùng một địa chỉ gửi
  • encryption: Đây là giao thức mã hóa sẽ được sử dụng bất cứ khi nào email được gửi đi. Thường sử dụng với 2 giao thức mã hóa chính là ssl và tls.
  • username: Địa chỉ email gửi đi
  • password: Mật khẩu email gửi đi
  • sendmail: Đường dẫn tới SendMail, nếu SendMail driver được sử dụng trên server
  • pretend: Nếu set true thì Email sẽ được ghi vào file log. Chứ không phải là gửi một email thực sự

Một file config hoàn chỉnh có dạng như sau:

return [
	'driver' => 'smtp',
    'host' => 'smtp.gmail.com',
    'port' => 587,            //Default
    'from' => ['address' => 'viblo@gmail.com', 'name' => 'Viblo Test'],
    'encryption' => 'tls',
    'username' => 'test123@gmail.com',
    'password' => '123456',
    'sendmail' => '/usr/sbin/sendmail -bs',
    'pretend' => false,
]

Sending Mail

Trong ví dụ này, khi người dùng đăng ký thành công. Hệ thống sẽ gửi một email kích hoạt tài khoản vào mail của người dùng. Laravel sẽ sử dụng phương thức Mail::send() với nội dung như sau:

Mail::send('folder.view', $data, function($message) {
    $message->to('test@gmail.com', 'Viblo')->subject('Welcome to the Viblo!');
});

Một ví dụ cụ thể làm việc với Mail::send() như sau:

 	$input = Input::get();
    $validator = Validate::make($input, $rules);
    if ($validator->fails()) {
    	Return Redirect::action('RegistorController@getIndex')
        	->withErrors($validator);
    }

    $result = User::create($input);
    if ($result) {
    	Mail::send('users.mails.welcome', array('firstname'=>Input::get('firstname')), function($message){
        $message->to(Input::get('email'), Input::get('firstname').' '.Input::get('lastname'))->subject('Welcome to the Viblo!');
    	});
        Return Redirect::action('RegistorController@getComplete');
    } else {
    	Return Redirect::action('RegistorController@getIndex')
        	->withErrors('Can not send email');
    }

Đọc đến đây, các bạn sẽ thắc mắc trường đầu tiên khi gọi Mail::send() có ý nghĩa là gì? Câu trả lời là đây là template của email. Vậy để hoàn thiện một email gửi đi, bước tiếp theo chúng ta cần làm là tạo một template cho email. Trong ví dụ này, Các bạn vào đường dẫn users/mails. Tạo file welcome.blade.php với nội dung như sau:

<h1>Hi, {{ $firstname }}!</h1>
 <p>We'd like to personally welcome you to the Viblo. Thank you for registering!</p>

Đương nhiên là chúng ta có thể tùy chỉnh nổi dung trong file này sao cho phù hợp với công việc của mình.

Trên đây là các bước cơ bản để gửi một email. Các bạn hãy thủ tạo một form và sử dụng nhé. ^^

Chú ý

Làm việc với mail thì Laravel sẽ mặc định sử dụng Queue driver là sync. Khi làm việc thực tế với thao tác gửi mail, các bạn sẽ nhận thấy một điều rằng. Với driver là sync thì chương trình của chúng ta sẽ chạy tuần tự thao tác như sau.

  • Khi đến câu lệnh gọi hàm Mail::send(): Chương trình tiến hành gửi email, khi nào gửi mail thành công thì mới tiếp tục lệnh tiếp theo là lệnh redirect tới màn hình complete.

Quá trình gửi mail này có thể diễn ra trong vài giây đến vài chục giây (trong trường hợp không có lỗi trong quá trình gửi mail). Điều này gây bất tiện lớn cho phía người dùng. Người dùng phải đợi vài chục giây đợi trình duyệt reload trong lúc gửi mail. @@.

Để khắc phục được tình trạng trên, chúng ta sử dụng một quere driver khác với sync driver.

Như các bạn biết, có rất nhiều driver giúp thao tác với queue. trong bài này tôi xin giới thiệu cách sử dụng với beanstalkd driver. Khi sử dụng beanstalkd driver có gì khác biệt với sync. Khi chúng ta làm việc với beanstalkd, chương trình chạy đến lệnh Mail::send() sẽ không tiến hành gửi mail ngay lập tức tại lệnh này mà sẽ ghi lại vào queue và chuyển sang Redirect tới màn hình complete. Khi nào gọi queue:listen thì mới tiến hành gửi mail.

Cài đặt Beanstalkd

Muốn sử dụng được beanstalkd trước tiên chúng ta phải tiến hành cài đặt nó trên server. Các bước cài đặt như sau. (Cho linux)

  • Tiến hành cài EPEL:

    Bước 1: wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

    Bước 2: rpm -ivh epel-release-7-5.noarch.rpm

  • Cài Beanstalkd:

    sudo yum install beanstalkd --enablerepo=epel-testing

  • require pheanstalk cho Laravel:

    composer require pda/pheanstalk

Sau khi cài đặt thành công, tiến hành chạy beanstalkd

  • beanstalkd -l 127.0.0.1 -p 11300

Muốn thực hiện gửi mail, chạy queue listen:

  • php artisan queue:listen

Trên đây là một số kinh nghiệm bản thân tôi khi thao tác gửi mail với Laravel. Chúc các bạn thành công. ^^

0