为什么Laravel会发送两次邮件?

7
我建立了一个联系表单,但它发送了两封邮件而不是一封。以下是控制器代码:
<?php

namespace App\Http\Controllers;

use App\Http\Requests\ContactFormRequest;
use App\Mail\ClientContact;
use Illuminate\Support\Facades\Mail;

class ContactController extends Controller
{
    /**
     * It sends a contact request and returns
     * the user back to the contact form.
     * @param ContactFormRequest $request
     * @return mixed
     */
    public function send(ContactFormRequest $request)
    {
        Mail::send(new ClientContact($request->only(['name','email','message'])));
        session()->flash('success','Your message was sent successfully!');
        return redirect()->back();
    }
}

这是ClientContact邮件类:
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class ClientContact extends Mailable
{
    use Queueable, SerializesModels;
    /**
     * @var
     */
    public $message;


    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($message)
    {
        $this->message = $message;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this
            ->from(config('mail.from.address'))
            ->markdown('emails.client.contact', ['message' => $this->message]);
    }
}

这是我的测试环境,所以我通过Mailtrap.io捕获出站邮件,并将队列设置为同步。我已经尝试删除Queueable trait,但是由于它根本没有排队,所以这并没有改变任何事情。我还尝试将其放入队列中,当队列最终处理电子邮件时,我会再次收到两封发送的电子邮件。

有什么想法吗?


公共函数发送(ContactFormRequest $request) 这是一个POST还是GET请求? - Anar Bayramov
这是一个 post 路由。Route::post('contact-form', 'ContactController@send')->name('contact.form'); - Azeame
我刚才意识到在Mailtrap(我的测试环境)中看到了同一封电子邮件的两个副本,因为我的应用程序使用TO和BCC发送。Mailtrap需要显示2份副本。 - Ryan
5个回答

8

这是一个mailtrap问题,只有在您使用bcc方法时才会出现。


2
这实际上就是我的问题所在。 - Zac Grierson
我正在使用AWS SES服务,我遇到了相同的问题。此外,我没有使用BCC方法。我还没有找到任何解决方案。 - Furkan ozturk
是的,没错,当我注释掉BCC行时问题就被解决了。 - habib

3

好的,找到了一个解决办法。当我在mail.php配置文件中删除'to'条目,并在Mail::send/queue命令中硬编码目标地址而不是使用config('mail.to')获取目标地址时,我可以收到1封电子邮件。如果我使用config()来定义收件人,则会收到2封电子邮件。希望这能有所帮助。


1
我最近遇到了这个问题。我的解决方法是在表单中添加JS功能(您也可以使用jQuery或其他库),因此每当您提交表单时,所有输入,包括按钮,都将被禁用/设置为只读。
使用此功能后,不再重复发送电子邮件。请看以下示例(我在此使用jQuery):
$(document).ready(function(){
    $('form').on('submit', function(){
        $('.btn').prop('disabled', true);
        $('.btn').html('Sending ...');
        $('input, textarea').prop('readonly', true);
    });
});

浏览器在您提交表单或单击按钮时尝试调用应用程序中的post请求,因此通过使用这种简单技术,您可以禁用表单中发送多个请求的功能。

如果问题是提交按钮的双击,那么这个方法本来可以解决的。但实际上这是在phpunit测试期间发生的,不过对于用户来说这是一个很好的UI响应,所以我还是会给你点赞。 - Azeame

0

如果你和我一样使用Macbook等(苹果相关)的设备,你很可能已经开启了iCloud。这就是问题所在,iCloud备份并同步了供应商文件夹,这是一场噩梦。在我的情况下,由于OSX的美妙世界,我有4个邮件外观。

关闭文档的iCloud备份(但要进行本地备份,不要放在iCloud上),现在删除本地备份中的供应商文件夹并重新安装。 然后..你完成了。大功告成。


很好的发现,希望能帮助一些不幸遇到这个问题的人。但对我来说,这并不是一个问题,我在Windows和Ubuntu机器上都遇到过这个问题。 - Azeame

0

Chrome扩展问题

测试您的post/get/delete请求是否不在Chrome中,并且如果它们发送两次。如果它们在另一个浏览器中没有发送两次或更多,则请检查Chrome的隐身模式,如果出现相同的问题。

如果隐身模式下没有发生这种情况,则您可能有一个需要删除(而不是禁用)的有缺陷的Chrome插件或扩展程序。请向制作插件/扩展程序的开发人员发送故障报告,作为开发人员,我相信他们会很乐意知道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接