4

我从 Laravel 升级4.15.4. 队列迁移很困难。

首先,我从路线中注释掉iron路线:

Route::post('queue/receive', function()
{
    return Queue::marshal();
});

然后,我配置了数据库驱动程序并迁移了jobs表:

php artisan queue:table
php artisan migrate

我将Mail::queue代码更改为 Mailables,如下所示:

Mail::to('person@gmail.com')->send(new ForgotPassword($user->first_name));

我成功同步发送邮件(没有队列)。然后,我切换到队列:

Mail::to('person@gmail.com')->queue(new ForgotPassword($user->first_name));

最后,我从控制台运行这个命令:

php artisan queue:listen

执行Mail::to一行时,会向Jobs表中插入一行,但不发送邮件。我怎么解决这个问题?

注意:ForgotPassword是一个Mailable类(应该是一个Job类?)。

4

3 回答 3

4

就您的对象而言,同步send()和异步之间的主要区别在于,当您将对象排队发送时,必须将其序列化以发送到队列,并在队列工作者处理它时取消序列化。queue()ForgotPassword

由于send()工作正常,但发生错误queue(),并且我们可以看到排队的作业已被触发并正在尝试处理,因此序列化/反序列化中很可能存在错误。

您的ForgotPassword班级可能正在使用该SerializesModels特征,因为这是 artisan 命令生成新可邮寄对象的方式。此特征定义__sleep()__wakeup()方法,它们修改序列化和反序列化的工作方式。

__sleep方法实现时,PHP 只会对__sleep方法返回的变量进行序列化。在这种情况下,SerializesModelstrait 提供的实现使用反射来遍历类上定义的属性,以提供一种特殊的方式来序列化 Eloquent 模型和集合。

正因为如此,这意味着您的ForgotPassword类中未明确定义为类属性的任何变量都不会被序列化,并且在处理队列作业并且类未序列化时将不可用。这是您的问题的最可能原因。当您的工作被尝试时,您的未序列化可邮寄实例没有它需要的数据,并且正在失败。

有两种方法可以解决这个问题。首先,如果您ForgotPassword实际上不需要序列化任何模型,则可以删除该SerializedModels特征。这将从类中删除__sleep()定义,然后分配给类的所有变量,而不仅仅是那些实际定义的变量,都将被序列化,并且在类被反序列化时也将可用。

第二个选项更合适、更明确,是在类上实际定义您需要的属性ForgotPassword

如果你在你的类上定义属性,你可以SerializesModels在你的类上留下特征。但是,如果您实际上并没有序列化模型,我会继续删除它。如果您不需要它,则不需要额外的序列化开销。

于 2017-02-26T07:46:26.497 回答
1

您可以使用 laravel 队列发送邮件,请参阅示例,

定义工作

public function handle()
{
        $mail_meta_data = $this->send_data;
        $require_data = $this->require_data;
        Mail::queue($mail_meta_data['view_name'], ['data'=>$require_data], function($message) use ($mail_meta_data, $require_data) {
            //$message->from($mail_meta_data['to'], $mail_meta_data['name']);

            $message->to($mail_meta_data['to'])->subject($mail_meta_data['subject']);
        });
 }

打电话给工作

dispatch(new SendEmailNotification($mail_meta_data, $require_data));

.env

 MAIL_DRIVER=smtp
 MAIL_HOST=smtp.sendgrid.net
 MAIL_PORT=587
 MAIL_USERNAME=smtp_username
 MAIL_PASSWORD=smptp_password
 MAIL_ENCRYPTION=tls

 APP_EMAIL=email sent from
 APP_NAME=Name of Email sender

笔记

  1. 确保您在 .env 文件或 config/mail.php 中设置了上述邮件配置
  2. php artisan queue:listen 也在运行
于 2017-02-23T05:16:37.917 回答
0

您可能需要编辑机器上项目文件夹中的现有 .env 文件。查找 .env 文件,通过 sublime text 打开并编辑它。

使用您要用来发送邮件的电子邮件 ID 和密码进行编辑。

于 2017-02-22T18:50:11.277 回答