Email queue component for yii2 that works with yii2-swiftmailer
The preferred way to install this extension is through composer.
Either run
php composer.phar require --prefer-dist nterms/yii2-mailqueue "*"
or add
"nterms/yii2-mailqueue": "*"
to the require section of your composer.json
file.
Once the extension is installed, add following code to your application configuration :
return [
//....
'components' => [
'mailqueue' => [
'class' => 'nterms\mailqueue\MailQueue',
'table' => '{{%mail_queue}}',
'mailsPerRound' => 10,
'maxAttempts' => 3,
],
],
];
Following properties are available for customizing the mail queue behavior.
table
: Name of the database table to store emails added to the queue.mailsPerRound
: Number of emails to send at a time.maxAttempts
: Maximum number of sending attempts per email.
Apply the database migration to create the table required to store the mail queue messages. To do this,
add following code to /config/console.php
:
return [
//....
'components' => [
'mailqueue' => [
'class' => 'nterms\mailqueue\MailQueue',
'table' => '{{%mail_queue}}',
],
],
];
then run yii migrate
command in command line:
php yii migrate/up --migrationPath=@vendor/nterms/yii2-mailqueue/migrations/
Now calling process()
on Yii::$app->mailqueue
will process the message queue and send out the emails.
In one of your controller actions:
public function actionSend()
{
Yii::$app->mailqueue->process();
}
Most preferably this could be a console command (eg: mail/send) which can be triggered by a CRON job.
Set a CRON job to run console command:
*/10 * * * * php /var/www/html/myapp/yii mailqueue/process
You can then send an email to the queue as follows:
Yii::$app->mailqueue->compose('contact/html')
->setFrom('[email protected]')
->setTo($form->email)
->setSubject($form->subject)
->setTextBody($form->body)
->queue();
While nterms\mailqueue\MailQueue
extends from yii\swiftmailer\Mailer
, you can replace it with this extension by adding
yii2-swiftmailer
configuations directly to mailqueue
configurations as follows:
return [
//....
'components' => [
'mailqueue' => [
'class' => 'nterms\mailqueue\MailQueue',
'table' => '{{%mail_queue}}',
'mailsPerRound' => 10,
'maxAttempts' => 3,
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'localhost',
'username' => 'username',
'password' => 'password',
'port' => '587',
'encryption' => 'tls',
],
],
],
];
And use following code for directly sending emails as you ususally do with yii2-swiftmailer
:
Yii::$app->mailqueue->compose('contact/html')
->setFrom('[email protected]')
->setTo($form->email)
->setSubject($form->subject)
->setTextBody($form->body)
->send();