HomeLập trình

Cách gửi mail trong laravel Framework – phần 1

Like Tweet Pin it Share Share Email

Phần 1: hướng dẫn cách gửi mail trong laravel framework qua SMTP của gmail.

Ứng dụng gửi mail được áp dụng rất nhiều trong các project, phần này mình hướng dẫn cơ bản về cách làm, vì mỗi ứng dụng có cách lấy dữ liệu khác nhau.

ưu điểm cách làm này, chờ post một bài rất chậm vì quá trình xử lý gửi mail. Sang phần 2 mình sẽ hướng dẫn cách xử lý gửi mail qua Queue.

Thông tin

– Phiên bản laravel 5.8

– Ứng dụng diễn đàn cơ bản gửi mail thông báo lại khi tạo thread thành công.

– Sử dụng Resource Controller

– Gửi mail bằng SMTP gmail

Cách làm

– Cấu hình trong file .env

 MAIL_DRIVER=smtp
 MAIL_HOST=smtp.gmail.com
 MAIL_PORT=587
 MAIL_USERNAME= Dia_chi_gmail
 MAIL_PASSWORD= Mat_khau_gmail
 MAIL_ENCRYPTION=tls

Chú ý:
Chắc chắn gmail của bạn đã tắt xác minh 2 bước

Bạn có thể kiểm tra lại theo cách sau:

  • Bật xác minh 2 bước.
  • Tắt xác minh 2 bước.
  • Đăng nhập bằng xác minh 2 bước.
  • Khóa bảo mật.
  • Cài đặt Google Authenticator
  • Thêm hoặc xóa máy tính đáng tin cậy.
  • Xóa mật khẩu ứng dụng.
  • Sử dụng điện thoại mới để nhận mã xác minh 2 bước.

Vào Cài đặt (setting) của mail, chọn Thay đổi Tùy chọn và khôi phục mật khẩu

Tắt xác minh 2 bước như hình dưới.

  OK, như vậy là cài đặt và xử lý phần gmail đã xong.
Giờ chúng ta bắt đầu vào ứng dụng.

Tạo view có tên là SendMailCreateThreadToSuccess.blade.php

<h2>Thank you for Post Thread on Forum Us!</h2>
 <p>Title : <b>{{ $thread->title }}</b></p>
 <p>Link : <b>http://ictsharing.com/{{ $thread->path() }} </b></p>
 <h3>Thanks</h3>

Chuột phải vào thư mục project để mở Terminal và gõ lệnh sau:

$ php artisan make:mail SendMailCreateThreadToSuccess

Sau khi tạo xong, file SendMailCreateThreadToSuccess.php sẽ nằm trong thư mục AppMail như hình bên dưới.

Mở file appmailSendMailThreadToSuccess.php và cấu hình thêm

<?php

 namespace App\Mail;

 use Illuminate\Bus\Queueable;
 use Illuminate\Mail\Mailable;
 use Illuminate\Queue\SerializesModels;
 use Illuminate\Contracts\Queue\ShouldQueue;
 use App\User;
 use App\Thread;

 class SendMailCreateThreadToSuccess extends Mailable
 {
     use Queueable, SerializesModels;
     public $user;
     public $thread;
    
     /**
      * Create a new message instance.
      *
      * @return void
      */
     public function __construct(User $user, Thread $thread)
     {
   
         $this->user = $user;
         $this->thread = $thread;
     }

     /**
      * Build the message.
      *
      * @return $this
      */
     public function build()
     {
         return $this->view('threads.sendMailCreateThreadToSuccess');
     }
 }

Trong đó:
– use AppUser: là Model của User truyền vào để lấy thông tin user cụ thể là mail
– use AppThread: Model của Thread

Hàm __construct là hàm khởi tạo được truyền hai tham số User và thread
Hàm Build trả về view vừa tạo ở trên đó cũng chính là nội dung email gửi về cho tác giả tạo thành công thread.
Xem trên hình ảnh:

Trong controller:
 Nhận request, tạo thread và gửi mail thông báo khi tạo thành công.
 Xử lý ở hàm store như sau:

public function store(Request $request, User $user)
     {
        
         $this->validate($request, [
             'title' => 'required',
             'body' => 'required',
             'channel_id' => 'required|exists:channels,id'
         ]); 
         
         $thread = Thread::create([
             'user_id' => auth()->id(),
             'channel_id' => request('channel_id'),
             'title' => request('title'),
             'body' => request('body')
         ]);
         
         // send mail to creator thread
         Mail::to($request->user(), $thread)->send(new SendMailCreateThreadToSuccess($user, $thread));

         return redirect($thread->path())
                 ->with('flash', 'Your thread has been published');
     }

Xem trên hình ảnh:

 Mình chụp cả phần đầu để các bạn đừng quên thêm use Mail và use AppMailSendMailCreateThreadToSuccess;

Cuối cùng là xử lý hàm store

Ở đây, trong ứng dụng của các bạn chỉ chú ý đoạn

// send mail to creator thread
 Mail::to($request->user(), $thread)->send(new SendMailCreateThreadToSuccess($user, $thread));

Đoạn này để gửi mail cho người tạo thread và truyền thông tin thread vào view gửi về mail.

 => Như vậy là xong.
Giờ chúng ta thử tạo thread nhé!

Kết quả trả về mail

Cách gửi mail trong laravel 5.8 bằng SMTP của gmail đã thành công. Tuy nhiên, khi làm thành công các bạn sẽ thấy, khi nhấn publish sẽ phải đợi 3-4s để gửi mail thành công mới trả về thành công.
Phần 2 mình sẽ hướng dẫn cách gửi mail sử dụng hàng đợi mà hiện nay đang được sử dụng rất phổ biến.
Nếu có thắc mắc các bạn đừng ngại gửi comment phía dưới nhé!

Comments (1)

  • sau khi gửi mail đi rồi. những người khác làm việc reply vào thread mail đó rồi. Mình muốn gửi mail vào tiếp thread đó (reply vào mail đã gửi lúc đầu) thì làm ntn bạn nhỉ?

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *