我正在使用Yii 2和yii2-queue包从队列进程发送一批电子邮件。
class SendEmailReminder extends \yii\base\BaseObject implements \yii\queue\JobInterface
{
public $userId;
public function execute($queue)
{
$user = \app\models\User::find()
->select(['id', 'email', 'username'])
->where('id=:uid AND verified=false')
->params([':uid' => $this->userId])
->asArray()
->one();
if ($user) {
$body = 'test mail';
Yii::$app->mailer->compose()
->setFrom(Yii::$app->params['fromEmail'])
->setTo('myemail@address')
->setSubject('Reminder')
->setTextBody($body)
->send();
}
}
}
在另一个控制器动作中我有这个:
public function actionRemindUsersWithNoValidatedEmail()
{
$users = User::find()
->select(['id'])
->where(['and', 'verified=false', '(NOW() - registered) > INTERVAL \'6 day\''])
->asArray()
->all();
foreach ($users as $user) {
Yii::$app->queue->push(new SendEmailReminder([
'userId' => $user['id']
]));
}
}
我的web.php配置:
'components' => [
..............
'queue' => [
'class' => \yii\queue\file\Queue::class,
'path' => '@runtime/queues',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => false,
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'host',
'username' => 'user',
'password' => 'pass',
'port' => '587',
'encryption' => 'tls',
]
],
]
和我的console.php配置:
'components' => [
'queue' => [
'class' => \yii\queue\file\Queue::class,
'path' => '@runtime/queues',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => false,
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'host',
'username' => 'user',
'password' => 'pass',
'port' => '587',
'encryption' => 'tls',
]
],
],
我将动作提醒 - 用户 - 没有验证 - 电子邮件,我可以看到@ runtime /队列填满队列文件。如果我执行./yii queue/run
,我可以看到队列被清空(因此被处理),但遗憾的是没有发送电子邮件。我在这里错过了什么?
答案 0 :(得分:0)
知道了。因为我从命令行运行./yii queue/run
,所以很难找到基本URL。所以我不得不在console.php中插入此代码(在组件部分内):
'urlManager' => [
'class' => 'yii\web\UrlManager',
'scriptUrl' => 'http://myurl'
]
我在使用详细标记运行./yii queue/run -v
后发现错误。谢谢大家!