无法从队列进程发送电子邮件

时间:2018-01-29 20:45:43

标签: php yii2 queue swiftmailer

我正在使用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,我可以看到队列被清空(因此被处理),但遗憾的是没有发送电子邮件。我在这里错过了什么?

1 个答案:

答案 0 :(得分:0)

知道了。因为我从命令行运行./yii queue/run,所以很难找到基本URL。所以我不得不在console.php中插入此代码(在组件部分内):

'urlManager' => [
    'class' => 'yii\web\UrlManager',
    'scriptUrl' => 'http://myurl'
]

我在使用详细标记运行./yii queue/run -v 后发现错误。谢谢大家!