【问题标题】:Mail is showing a blank POST status邮件显示空白 POST 状态
【发布时间】:2018-07-02 02:33:23
【问题描述】:

我在 Laravel 中有一个联系表格,它发送 2 封电子邮件 - 一封确认电子邮件给用户,然后给发件人。

我没有收到任何错误,并且在我的网络选项卡中显示 POST 状态但没有状态代码。当我点击发送时页面刚刚刷新。如果有人可以看看并提出一些建议,那么我就可以得到一个错误来处理一些事情。

这是我的 HTML:

      <div id="contact">
        <form class="form-horizontal" id="contactForm" role="form">
              {{ csrf_field() }}

              @if(Auth::guest())

              <div class="form-group">
                <label for="exampleInputName2">Name</label>
                <input type="text" class="form-control" id="name" placeholder="Jane Doe" name="name">
              </div>
              <div class="form-group">
                <label for="exampleInputEmail2">Email</label>
                <input type="email" class="form-control" id="email" placeholder="jane.doe@example.com" name="email">
              </div>

              @else

              <div class="form-group">
                <label for="exampleInputName2">Name</label>
                <input type="text" class="form-control" id="name" value="{{ Auth::user()->getFullName() }}" name="name">
              </div>
              <div class="form-group">
                <label for="exampleInputEmail2">Email</label>
                <input type="email" class="form-control" id="email" value="{{ Auth::user()->email }}" name="email">
              </div>

              @endif

              <div class="form-group ">
                <label for="exampleInputText">Your Message</label>
               <textarea id="message" name="message" class="form-control" placeholder="Description"></textarea>
              </div>
              <button type="submit" class="btn btn-default" v-on:click="submitMessage">Send Message</button>
            </form>
      </div>

我的 Ajax 调用(使用 Vue.js):

    var contact = new Vue({
          el: '#contact',
          data: {

          },

          methods: {
            submitMessage: function(){
              $.ajaxSetup({
                headers: {
                  'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr("content")
                }
              });

              $.ajax({
                url: '/pages/contact/sendMessage',
                type: 'POST',
                data: $("#contactForm").serialize(),
                success: function(response){
                  toastr.success(response.response);
                },
                error: function(error){
                  toastr.success(error.error);
                }
              });
            }
          }
        });

我的路线:

Route::post('/pages/contact/sendMessage', 'ContactController@sendMessage');

我的控制器:

public function sendMessage(Request $request){
      $this->validate($request, [
        'name' => 'required',
        'email' => 'required',
        'message' => 'required'
      ]);

      $users = User::all();
      $emails = collect($users)->pluck('email')->all();

      if(Auth::user()){
        $user = Auth::user()->getFullName();
        $email = Auth::user()->email;
      }else{
        $user = $request->input('name');
        $email = $request->input('email');
      }

      $message = $request->input('message');

      Mail::to($emails)->send(new Contact($user, $email, $message));

      Mail::to($email)->send(new ContactConfirm($user, $email, $message));

      $response = [
        'response' => 'Email Successfully Sent',
        'error' => 'Something went wrong'
      ];

      return response()->json($response);

  }

我的邮件:

    public $title;
    public $introLines;
    public $outroLines;
    public $actionText;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($user, $email, $message)
    {
      $this->title = 'Contact from' . ' ' . $user;
      $this->$introLines = ['The following user has issued a message'];
      $this->$outroLines = ['User: ' . $user, 'Email: ' . $email, 'Message: ' . $message];
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.template');
    }

我的 .env:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=email@gmail.com
MAIL_PASSWORD='app password'
MAIL_ENCRYPTION=tls

我还更新了我的config/mail.php 以获得与上述相同的信息。在 .env 更改后,我确实多次停止并启动了我的服务。

【问题讨论】:

  • 您的日志文件中是否有一些信息位于storage/logs
  • [2018-01-23 10:47:35] local.ERROR: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed {"userId":1,"email":"myemail@gmail.com","exception":"[object] (ErrorException(code: 0): stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed at C:\\xampp\\htdocs\\laravel\\vendor\\swiftmailer\\swiftmailer\\lib\\classes\\Swift\\Transport\\StreamBuffer.php:94)
  • 这是日志中的最后一项,但我现在再次测试,日志中没有任何新错误

标签: php ajax laravel email vue.js


【解决方案1】:

我相信问题实际上是您的“提交”按钮。默认情况下带有type=submit 的按钮将提交给您没有的表单“action=''”属性,这将导致表单/页面刷新。

将按钮改为

`<button type="button">` 

然后这将阻止默认操作,然后将触发您的 ajax 调用。

或者我认为你也可以使用

`<button @click.prevent="submitMessage">` 

这基本上会做同样的事情。

如果需要,您还可以将.prevent 指令放在表单元素本身上。

<form v-on:submit.prevent></form>

【讨论】:

  • 非常感谢 - 我需要这个。单击按钮时,我的页面不断重定向,我无法弄清楚。现在我至少得到一个错误 500 - 比我以前的要好。谢谢!
  • 很高兴它有帮助。如果我的答案很好,请将我的答案标记为“已接受的答案”:) 即单击答案旁边的复选标记
【解决方案2】:

这可能不是问题,但您应该进行此更改:

// you are wrapping a collection in collect() and chaining all() incorrectly
$users = User::all();
$emails = collect($users)->pluck('email')->all();

// instead simply do
$emails = User::all()->pluck('email');

这一行虽然是向数据库中的每个用户发送电子邮件。

  Mail::to($emails)->send(new Contact($user, $email, $message))

编辑

根据该日志错误,您应该更改此邮件配置

'ssl' => [
   'allow_self_signed' => true,
   'verify_peer' => false,
   'verify_peer_name' => false,
],

【讨论】:

  • 感谢您的提示,我会在收到要发送的电子邮件后进行调查。
  • 更新您的邮件配置以通过 localhost 使用 ssl