
چگونه در لاراول چندین ایمیل را با صف ارسال کنیم؟
در این قسمت از آموزش لاراول نحوه ارسال همزمان چندین ایمیل را در لاراول آموزش خواهیم داد. همانطور که میدانید ما میتوانیم با کمک کلاس mail لاراول به راحتی برای ارسال ایمیل اقدام کنیم؛ اما اگر قصد ارسال انبوه داشته باشیم ارسال تک به تک آنها زمان زیادی از ما خواهد گرفت و اگر هم بخواهیم مثلا از حلقه استفاده کنیم نه تنها زمان زیادی صرف میشود بلکه در این بازه زمانی ما اجازه انجام هیچ کار دیگری را نخواهیم داشت. بنابراین اگر بخواهیم که ارسال انبوه ایمیل (bulk mail) داشته باشیم لازم است که از صف لاراول استفاده کنیم. با کمک صف ما میتوانیم فرآیند ارسال ایمیل ها را در پس زمینه انجام دهیم و در حین آن به انجام کار های دیگر بپردازیم.
در ادامه این پست نوحه ارسال ایمیل انبوه را مرحله به مرحله آموزش خواهیم داد.لطفا درصورتی که با نحوه ارسال ایمیل تکی آشنایی ندارید ابتدا به پست "چگونه در لاراول ایمیل ارسال کنیم؟" مراجعه کنید.
مرحله اول : پیکر بندی فایل env
.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=your_gmail@gmail.com
MAIL_PASSWORD=your_gmail_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=your_gmail@gmail.com
MAIL_FROM_NAME="${APP_NAME}"
- مرحله دوم : ایجاد Route
در این مرحله ما web route مورد نیاز برای ارسال ایمیل انبوه با ساتفاده از صف را ایجاد می کنیم.
Route::get('send/mail', [SendMailController::class, 'send_mail'])->name('send_mail');
- مرحله سوم : ایجاد جدول Job ها
اکنون ، جدول "jobs" را در پایگاه داده ایجاد می کنیم ، بنابراین دستور زیر را کپی کرده و در ترمینال خود اجرا کنید.
php artisan queue:table
php artisan migrate
- مرحله چهارم: ایجاد کنترلر
در این مرحله کنترلر SendMailController را ایجاد کرده و دستورات زیر را به آن اضافه خواهیم کرد.
App/Http/Controllers
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class SendMailController extends Controller
{
public function send_mail(Request $request)
{
$details = [
'subject' => 'Test Notification'
];
$job = (new \App\Jobs\SendQueueEmail($details))
->delay(now()->addSeconds(2));
dispatch($job);
echo "Mail send successfully !!";
}
}
- مرحله پنجم : ایجاد Job
حال فایل SendQueueEmail.php را در مسیر app>Jobs ایجاد خواهیم کرد. برای این کار کافی است دستور زیر را در ترمینال خود اجرا کنید.
php artisan make:job SendQueueEmail
مشاهده خواهید کرد که فایل مربوطه به صورت زیر ایجاد خواهد شد.
app/Jobs
<?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\User;
use Mail;
class SendQueueEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $details;
public $timeout = 7200; // 2 hours
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($details)
{
$this->details = $details;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$data = User::all();
$input['subject'] = $this->details['subject'];
foreach ($data as $key => $value) {
$input['email'] = $value->email;
$input['name'] = $value->name;
\Mail::send('mail.Test_mail', [], function($message) use($input){
$message->to($input['email'], $input['name'])
->subject($input['subject']);
});
}
}
}
- مرحله ششم: ایجاد Blade View برای ایمیل
فایل Test_mail.blade.php را در مسیر resources>views>mail ایجاد کرده و دستورات زیر را در آن قرار میدهیم.
resources/views/mail
<!DOCTYPE html>
<html>
<head>
<title>www.maryam-hajireza.ir</title>
</head>
<body>
<h1>Testing Bulk Email Using Que</h1>
<p>Hello this is a test email</p>
<p>Thank you</p>
</body>
</html>
در نهایت دستور زیر را در ترمینال وارد کنید تا ایمیل ها ارسال شوند.
php artisan queue:listen
در صورتی که میخواهید فرآیند ارسال ایمیل ها را با صدا زدن یک کنترلر شروع کنید میتوانید از کنترلر زیر استفاده کنید.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Jobs\SendQueueEmail;
class EmailController extends Controller
{
public function sendEmail()
{
$emailJob = new SendQueueEmail();
dispatch($emailJob);
}
}