Hướng dẫn Send EMail trong Laravel 9 với đầy đủ demo

Các bước dưới đây sẽ giúp các bạn tạo 1 app đơn giản để gửi mail từ localhost với laravel 9

  1. Tạo ứng dụng laravel 9
  2. Cấu hình file .env smtp google
  3. Tạo mail class
  4. Tạo router send Email
  5. Tạo controller và view blade
  6. Tạo Job Send Email
  7. Chạy chương trình

1 Tạo ứng dụng Laravel 9

Tạo ứng dụng laravel 9 với command sau :

composer create-project --prefer-dist laravel/laravel laemail

2 Cấu hình .env smtp google

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=qvnlxhqrcoeybj**
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="[email protected]"
MAIL_FROM_NAME="${APP_NAME}"

3 Tạo mail class

Chúng ta dùng lệnh sau : 

php artisan make:mail DemoEmail

Và code như sau ở file app/Mail/DemoEmail.php



namespace App\Mail;

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

class DemoEmail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    protected $data;
    public function __construct($data)
    {
        $this->data = $data;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        $data = $this->data;
        return $this->view('email.demo',compact('data'));
    }
}

Tạo blade mail resources/views/email/demo.blade.php

<h2>{{$data['title']}}</h2>
<div>
    <h3>{{$data['content']}}</h3>
</div>

4 Tạo router send Email

Ở router chúng ta thêm 2 router như sau :routes/web.php

Route::get('email',[\App\Http\Controllers\DemoController::class,'index'])->name('email');
Route::post('email',[\App\Http\Controllers\DemoController::class,'sendmail'])->name('sendmail');

5 Tạo controller và view blade

Tại Controller app/Http/Controllers/DemoController.php :

namespace App\Http\Controllers;

use App\Mail\DemoEmail;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class DemoController extends Controller
{
    public function index()
    {
        return view('email');
    }
    public function sendmail(Request $request)
    {
        $data['title'] ='Demo Email';
        $data['content'] = 'Đây là test';
        //Mail::to($request->email)->send(new DemoEmail($data));
        \App\Jobs\DemoEmail::dispatch($data,$request->email)->delay(now()->addSeconds(5));
        return redirect(route('email'))->with(['msg'=>'Đã gửi email thành công']);
    }
}

Tạo blade email.blade.php

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<div class="container">
    @if(\Illuminate\Support\Facades\Session::has('msg'))
    <div class="alert alert-primary" role="alert">
        {{ \Illuminate\Support\Facades\Session::get('msg')  }}
    </div>
    @endif
<form method="post" action="{{route('sendmail')}}">
    @csrf
    <div class="form-group">
        <label for="exampleInputEmail1">Email address</label>
        <input name="email" type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter email">

    </div>
    <button type="submit" class="btn btn-primary">Test Send Email</button>
</form>
</div>

6 Tạo Job Send Email

Tạo job với lệnh sau :

php artisan make:job DemoEmail

Ở file app/Jobs/DemoEmail.php



namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;

class DemoEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    protected $data;
    protected $email;
    public function __construct($data,$email)
    {
        $this->data = $data;
        $this->email = $email;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        Mail::to($this->email)->send(new \App\Mail\DemoEmail($this->data));
    }
}

7 Chạy chương trình

Chúng ta chạy lệnh 

php artisan serve

Sau đó truy cập link : http://127.0.0.1:8000/email