ایجاد صف ارسال برای پیام‌ها در SwiftMailer

SwiftMailer یک کتابخانه قدرتمند برای ارسال ایمیل در php است، یکی از قابلیت‌های این کتابخانه امکان ایجاد صف ارسال ایمیل در هارد و ارسال ناهمگام ایمیل‌ها بصورت دوره‌ای است. این ویژگی در دو حالت بسیار کارآمد است، نخست اینکه ارسال ناهمگام ایمیل‌ها باعث افزایش سرعت ریسپانس سایت می‌شود، دیگر لازم به انتظار برای ارسال ایمیل نیست. همچنین درصورتی که قصد ارسال پیام‌ها تبلیغاتی متعدد دارید بهترین راه برای ارسال آنها بصورت دوره‌ای و تعداد کم است.

برای ایجاد صف (spool کردن) ایمیل‌‌ها در SwiftMailer کافی است یک شی از کلاس Swift_SpoolTransport بسازیم و از طریق این Transport پیام‌های خود را ارسال کنیم، این ترنسپورت بجای ارسال مستقیم پیام‌ها آنها را در مسیری در روی دیسک شما ذخیره می‌کند.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// Setup the spooler, passing it the name of the folder to spool to
$spool = new Swift_FileSpool(__DIR__ . "/spool");
// Setup the transport and mailer
$transport = Swift_SpoolTransport::newInstance($spool);
$mailer = Swift_Mailer::newInstance($transport);
// Create a message
$message = Swift_Message::newInstance('Excellent Subject')
->setFrom(array('sende...@domain.com' => 'John Doe'))
->setTo(array('your_emailAddress@domain.com'))
->setBody('spool messages !!!');
// Send the message
$result = $mailer->send($message);
echo "SPOOLED $result emails";

برای ارسال حقیقی پیام‌ها خالی کردن صف کافی است یک cron job (یک پروسه دیگر) تعریف کنیم و با استفاده از تابع flashQueue صف انتظار پیام‌ها را خالی کنیم. کد زیر نمونه‌ای است از نحوه خالی کردن صف پیام‌های spool شده.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
//create an instance of the spool object pointing to the right position in the filesystem
$spool = new Swift_FileSpool(__DIR__."/spool");
//create a new instance of Swift_SpoolTransport that accept an argument as Swift_FileSpool
$transport = Swift_SpoolTransport::newInstance($spool);
//now create an instance of the transport you usually use with swiftmailer
//to send real-time email
$realTransport = Swift_SmtpTransport::newInstance(
"smtp.gmail.com",
"465",
"ssl"
)
->setUsername("username")
->setPassword("password");
$spool = $transport->getSpool();
$spool->setMessageLimit(10);
$spool->setTimeLimit(100);
$sent = $spool->flushQueue($realTransport);
echo "SENT $result emails";

References: