对Laravel 5发送邮件队列感到困惑(Laravel 5.4)

时间:2017-02-19 18:59:17

标签: laravel laravel-5 laravel-queue laravel-mail

我从Laravel 4.1升级到5.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表中插入一行,但不会发送邮件。我该如何解决这个问题?

注意:ForgotPasswordMailable类(应该是Job类?)。

3 个答案:

答案 0 :(得分:2)

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

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

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

当实现__sleep方法时,PHP将仅序列化__sleep方法返回的变量。在这种情况下,SerializesModels特征提供的实现使用Reflection来遍历在类上定义的属性,以提供一种特殊的方法来序列化Eloquent模型和集合。

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

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

第二个选项,更合适,更明确,是实际定义ForgotPassword类所需的属性。

如果您在课程中定义属性,则可以在课程中保留SerializesModels特征。但是,如果您实际上没有序列化模型,我会继续将其删除。如果您不需要,则无需额外的序列化开销。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

定义作业

@Override
public void onCreate(Bundle state) {
    super.onCreate(state);
    setContentView(R.layout.localgame);

致电职位

    @Override
    public void onBackPressed() {
        Log.d("myTag", "DETECTED BACK");
        if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
            Log.d("myTag", "THERE WAS SOMETHING IN THE FRAGSTACK");
            getSupportFragmentManager().popBackStack();
            getSupportFragmentManager().beginTransaction().commit();
        } else {
            super.onBackPressed();
        }
    }
}

<强> .ENV

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.settlers.hd, PID: 12710
                  java.lang.IllegalArgumentException: No view found for id 0x7f070025 (com.settlers.hd:id/fragment_container) for fragment GameManager{c2a128d #0 id=0x7f070025 GameManager}
                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:930)
                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
                      at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:764)
                      at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1527)
                      at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:485)
                      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
                      at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5551)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

注意

  1. 确保您在.env文件或config / mail.php中设置了上述邮件配置
  2. 另外php artisan队列:listen正在运行