【问题标题】:Why is Laravel sending mail twice?为什么 Laravel 会发送两次邮件?
【发布时间】:2017-07-11 18:26:15
【问题描述】:

我建立了一个联系表格,它发送两封电子邮件而不是一封。这是控制器:

<?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 特征,但这并没有改变任何东西,因为它无论如何都没有排队。我也试过把它放在队列上,当队列最终处理完我的邮件时,我收到了两封已发送的邮件。

有什么想法吗?

【问题讨论】:

  • public function send(ContactFormRequest $request) 是这个帖子还是得到?
  • 这是一个邮寄路线。 Route::post('contact-form', 'ContactController@send')-&gt;name('contact.form');
  • 我刚刚意识到我在 Mailtrap(用于我的测试环境)中看到了同一电子邮件的 2 个副本,因为我的应用程序使用 TO 和 BCC 发送。 Mailtrap 需要显示 2 个副本。

标签: laravel laravel-5.3 laravel-mail


【解决方案1】:

这是一个mailtrap 问题,并且仅当您使用bcc 方法时。

【讨论】:

  • 这实际上是我的问题。
  • 我正在使用 aws ses 服务,但我遇到了同样的问题。另外,我没有使用密件抄送方法。我还没有找到任何解决方案
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我最近遇到了这个确切的问题。我所做的是在表单中添加 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 响应,所以我仍然会给出你点赞
    【解决方案4】:

    如果您喜欢我并使用 Macbook 等(Apple 相关),您很可能已打开 icloud。这就是问题所在,icloud 备份并同步供应商文件夹,这是一场噩梦。就我而言,多亏了 OSX 的精彩世界,我有 4 个邮件门面。

    为文档关闭 icloud(但进行不在 icloud 上的本地备份),现在删除本地备份中的供应商文件夹并重新安装。 而且..你完成了。沃拉。

    【讨论】:

    • 很好的发现,希望对其中一些人有所帮助,不幸的是,这对我来说不是问题,我在 Windows 和 Ubuntu 机器上都遇到过这个问题
    【解决方案5】:

    Chrome 扩展问题

    测试您的 post/get/delete 请求是否在 chrome 中,以及它们是否发送了两次。如果他们没有在另一个浏览器中发送两次或更多次,请检查 chrome 的隐身模式,如果出现同样的问题。

    如果它没有在隐身模式下发生,那么您的 chrome 插件或扩展程序有问题,需要删除(未禁用)。请向作为开发人员制作插件/扩展的开发人员发送故障报告,我相信他们想知道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      相关资源
      最近更新 更多