Laravel 8 Send Mail Using Queue Tutorial

Laravel

78

SHUBHAM KUSHWAH

27-09-2020


Laravel 8 Send Mail using Queue Tutorial

In this tutorial, we will implement a laravel 8 send mail in the queue.  Here you will learn the laravel 8 queue mail send. Alright, let’s dive into the steps.

Sometimes, you see some process take time to load like email send, payment gateway, etc. When you send emails for verification or send invoices then it loads time to send mail because it is services. If you don't want to wait for the user to send an email or other processes on loading the server-side process then you can use the queue. Because it's very fast and visitors will happy to see the loading time.

Here, I am going to share a very simple example to create a queue with a database driver for test email sending. You can definitely understand how to work queue and how it's easy. If you haven't used before then don't worry, here if from starch and very simple.

Step 1: Setup Laravel 8

first of all, we need to get a fresh Laravel 8 version application using the bellow command, So open your terminal OR command prompt and run bellow command:

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

Step 2: Create a Mail Setup

We are going from scratch and in the first step, we will create an email for testing using the Laravel Mail facade. So let's simple run bellow command.

php artisan make:mail SendEmailTest

Now you will have a new folder "Mail" in-app directory with SendEmailTest.php file. So let's simply copy bellow code and past on that file.

app/Mail/SendEmailTest.php

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

Ok, now we require to create an email view using the blade file. So we will create a simple view file and copy bellow code om following path.

resources/views/emails/test.blade.php

<!DOCTYPE html>
<html>
<head>
    <title>How to send mail using queue in Laravel 8? - w3alert.com</title>
</head>
<body>
   
<center>
<h2 style="padding: 23px;background: #b3deb8a1;border-bottom: 6px green solid;">
    <a href="https://w3alert.com">Visit Our Website : w3alert.com</a>
</h2>
</center>
  
<p>Hi, Sir</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
  
<strong>Thank you Sir. :)</strong>
  
</body>
</html>

After configuration of the view file, we have to set up for email send, So let' set configuration in the .env file:

.env

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=123456
MAIL_ENCRYPTION=tls
[email protected]
MAIL_FROM_NAME="${APP_NAME}"

Step 3: Configuration of Queue

Now in the next step, we will make configuration on the queue driver so first of all, we will set the queue driver "database". You can set as you want also we will define driver as redis too. So here define database driver on the ".env" file:

.env

QUEUE_CONNECTION=database

After that, we need to generate migration and create tables for the queue. So let's run bellow command for queue database tables:

Generate Migration:

php artisan queue:table

Run Migration:

php artisan migrate

Step 4: Create Queue Job

now we will create a queue job, bey, following command, this command will create a queue job file with Queueable. So let's run bellow command:

php artisan make:job SendEmailJob

now you have SendEmailJob.php file in the "Jobs" directory. So let's see that file and put the bellow code on that file.

app/Jobs/SendEmailJob.php

<?php
  
namespace App\Jobs;
  
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Mail\SendEmailTest;
use Mail;
  
class SendEmailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  
    protected $details;
  
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($details)
    {
        $this->details = $details;
    }
  
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $email = new SendEmailTest();
        Mail::to($this->details['email'])->send($email);
    }
}
 

Step 5: Test Queue Job

Now time is use and test the created queue job, so let's simply create a route with the following code for the testing created queue.

routes/web.php

Route::get('email-test', function(){
  
    $details['email'] = '[email protected]';
  
    dispatch(new App\Jobs\SendEmailJob($details));
  
    dd('done');
});

The okay route is defined, you can watch your queue process using the laravel queue command, so let's run bellow command:

php artisan queue:listen

You can also clear the config cache using bellow command:

php artisan config:clear

Now you can run the project using bellow command:

php artisan serve

Now run your project and bellow link:

http://localhost:8000/email-test