【问题标题】:Form sending mail thrice in laravel 5在 laravel 5 中发送三次邮件的表单
【发布时间】:2016-03-11 17:42:21
【问题描述】:

自从我开始学习 laravel 以来,我从未遇到过这个奇怪的问题。

我有一个联系表:contact.blade.php

{!! Form::open(['url' => '/contact-form', 'id' => 'formContact']) !!}
    <div class="col-md-12 col-sm-12 form-group">
        {!! Form::label('full_name', 'Full Name:', ['class' => 'fw_400']) !!}
        {!! Form::text('full_name', null, ['class' => 'form-control input-sm']) !!}
    </div>

    <div class="col-md-6 col-sm-6 form-group">
        {!! Form::label('email', 'Email:', ['class' => 'fw_400']) !!}
        {!! Form::text('email', null, ['class' => 'form-control input-sm']) !!}
    </div>

    <div class="col-md-6 col-sm-6 form-group">
        {!! Form::label('contact', 'Contact Number:', ['class' => 'fw_400']) !!}
        {!! Form::text('contact', null, ['class' => 'form-control input-sm']) !!}
    </div>


    <div class="col-md-12 col-sm-12 form-group">
        {!! Form::label('contact_message', 'Contact Message:', ['class' => 'fw_400']) !!}
        {!! Form::textarea('contact_message', null, ['class' => 'form-control input-sm', 'rows' => 5]) !!}
    </div>

    <div class="col-md-12 col-sm-12 form-group">
        {!! Form::submit('Submit', ['class' => 'btn btn-primary btn-block btnContactOnContactPage']) !!}
    </div>
{!! Form::close() !!}

当我点击提交按钮时,会进行 AJAX 调用。这是 ajax 处理程序:

(function() {
    $('#formContact').submit(function(e) {

        $('.btnContactOnContactPage').prop('disabled', true);

        var inputData = $('#formContact').serialize();

        $.ajax({
            url: $('#formContact').attr('action'),
            type: 'POST',
            data: inputData,
            success: function(m) {
                $('.btnContactOnContactPage').prop('disabled', false);

                if (m.status === 'success') {
                    toastr.success(m.msg);

                    setTimeout(function() {
                        window.location.reload();
                    }, 3000)
                }
            },
            error: function(e) {
                if (e.status === 422) {

                    $('.btnContactOnContactPage').prop('disabled', false);

                    var errors = e.responseJSON;

                    var errorsHtml = '<div class="alert alert-danger"><ul>';
                    errorsHtml += '<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>';
                    $.each(errors, function(key, value) {
                        errorsHtml += '<li class="text-danger">' + value[0] + '</li>';
                    });
                    errorsHtml += '</ul></div>';
                    $('.errors').html(errorsHtml);
                }
            }
        });

        return false;
    });
})();

以及控制器方法:

public function postContact(Request $request)
{
    $this->validate($request, [
        'full_name'       => 'required',
        'email'           => 'required|email',
        'contact'         => 'required|regex:/^[0-9+\-]+$/',
        'contact_message' => 'required'
    ]);

    if ($request->ajax()) {
        $prevContactCode = DB::table('contact_messages')->latest()->limit(1)->pluck('cont_code');
        if ($prevContactCode == "" || empty($prevContactCode)) {
            $request['cont_code'] = 'CON-000001';
        }
        else {
            $request['cont_code'] = ++$prevContactCode;
        }

        $contactMessage = ContactMessage::create($request->all());

        $dataToMail = [
            'cont_code'       => $contactMessage->cont_code,
            'full_name'       => $contactMessage->full_name,
            'email'           => $contactMessage->email,
            'contact'         => $contactMessage->contact,
            'contact_message' => $contactMessage->contact_message
        ];

        $mail = Mail::send('emails.contact', $dataToMail, function ($message) use($dataToMail)
        {
            $message->from($dataToMail['email'], $dataToMail['full_name']);
            $message->to('contact@example.com', 'Example Contact')
                    ->subject('Contact Form Details from example.com (Form No.:' . $dataToMail['cont_code'] . ')')
                    ->cc(['ex@example.net', 'exam@hotmail.com'])
                    ->bcc(['examp@gmail.com', 'esmap@example.net']);
        });

        var_dump($mail); // displays **int 5** in chrome console

        dd($mail); // displays **5** in chrome console

        if ($mail) {
            return response(['status' => 'success', 'msg' => 'Contact form details has been successfully submitted.']);
        }
    }

    return response(['status' => 'failed', 'msg' => 'Something went wrong. Please try again later.']);
}

问题在于,邮件被发送三次,而不是一次。我不知道这里发生了什么。早些时候[可能是 5 个月前],它工作正常,现在,突然之间,它开始这样做了。我试图弄清楚这背后的原因是什么,但没有成功。我还使用composer update 更新了框架,但问题仍然存在。

编辑 1:我在使用 Mail 外观进行反复试验,我猜问题出在 bcc 方法中,因为我没有尝试过 bcccc,它按预期工作。然后我再次尝试只使用cc 而没有bcc,这一次它也按预期正常工作,但是当添加bcccc 时,我收到了三次相同的邮件。

我在哪里犯了错误?请帮帮我。

【问题讨论】:

  • 打开浏览器控制台,看看有多少请求正在使用 ajax 发送。
  • 使用 ajax 仅发送 1 个请求。

标签: php jquery ajax email laravel-5


【解决方案1】:

一些邮件驱动程序,通常是 Mandrill,sends CC'ed & BCC'ed emails as separate emails instead of treating them as a single email

我没有使用过邮件陷阱,但同样的事情也可能发生在你的情况下。

【讨论】:

  • 感谢分享链接。
【解决方案2】:

此问题的常见原因可能是未阻止点击传播。这意味着即使您与放置在顶部的其他控件进行交互也可能会发送请求。

另一个原因是单击方法绑定不止一次发生。一旦服务器响应到来,当您绑定点击事件时就会发生这种情况。在这种情况下,这是一个常见问题。

如果您可以尝试在初始化请求的点击事件上添加 console.log,那就太好了。并查看它被记录了多少次。

如果您不能缩小范围,如果您可以提取代码子集并将其发布在 JSfiddle 或其他东西上以便其他人可以查看,那就太好了。

希望它会有所帮助。

【讨论】:

  • @user3514160 我可以看到您在前面的评论中也指定了即使 Ajax 请求也是网络选项卡中的一个。似乎问题在服务器或邮件服务器中更进一步。如果有办法检查代码以发送电子邮件,并且如果有测试邮件服务器,您可以检查您的工作流程,我认为这可能会缩小范围。
猜你喜欢
  • 1970-01-01
  • 2018-09-08
  • 2015-10-01
  • 1970-01-01
  • 2017-09-09
  • 2017-03-07
  • 2016-03-23
  • 2016-01-10
  • 1970-01-01
相关资源
最近更新 更多