Laravel Send Email using Queue
Step 1: Setup Laravel
composer create-project --prefer-dist laravel/laravel project_name
Step 2: Create Mail Setup
php artisan make: mail SendEmailTest
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');
}
}
resources/views/emails/test.blade.php
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
Hello
</body>
</html>
Step 3: Configuration of Queue
Set in ENV file QUEUE_CONNECTION=database
.env
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=mygoogle@gmail.com
MAIL_PASSWORD=rrnnucvnqlbsl
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=mygoogle@gmail.com
MAIL_FROM_NAME="${APP_NAME}"
QUEUE_CONNECTION=database
Step 4: Generate Migration:
php artisan queue:table
Step 5: Run Migration:
php artisan migrate
Step 6: Create Queue Job
php artisan make:job SendEmailJob
app/Jobs/SendEmailJob.php
<?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 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 7: Test Queue Job:
routes/web.php
Route::get('email-test', function(){
$details['email'] = 'your_email@gmail.com';
dispatch(new App\\Jobs\\SendEmailJob($details));
dd('done');
});
Next, you must have to run following command to see queue process, you must have to keep start this command:
php artisan queue:work
In Server:
a. **Installing Supervisor:
sudo apt-get install supervisor
For automatically restart your queue:work
processes in server.
cd /etc/supervisor/conf.d
ls
touch laravel-worker.conf //create laravel-worker.conf configuration file.
code laravel-worker.conf //open in VSCode.
la -al
sudo chmod 777 laravel-worker.conf -R
laravel-worker.conf
file:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work database --sleep=3 --tries=2 --daemon
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/html/worker.log
b. **Starting Supervisor:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
php artisan config:cache
c. Others command:
sudo service supervisor reload
sudo supervisorctl stop all
stop <name> Stop a process
stop <gname>:* Stop all processes in a group
stop <name> <name> Stop multiple processes or groups
stop all Stop all processes
composer require aws/aws-sdk-php
php artisan queue:failed-table
php artisan migrate