【问题标题】:Laravel 5 SwiftMailer's Send: how to get error codeLaravel 5 SwiftMailer 的发送:如何获取错误代码
【发布时间】:2018-01-30 20:27:21
【问题描述】:

我正在发送与此类似的电子邮件:Laravel 5: Sending Email。我就是这样做的:

$mail_status = Mail::send( 'emails.followup', $data, function( $message ) use ($data) {
             $message->to( $data['email'] )
            ->from( $data['email_from'], $data['email_name'] )
            ->subject( $data['subject'] );
        });

if($mail_status) {
    $ret_status = 'sent';
}
else
    $ret_status = 'sent_failed';

现在,如果$ret_status 是“sent_failed”,我想知道发生了什么。我该怎么做?如何查看来自邮件服务器的邮件?

这是我的.env 文件:

MAIL_DRIVER=smtp
MAIL_HOST=mail.mydomain.com
MAIL_PORT=465
MAIL_USERNAME=noreply@mydomain.com
MAIL_PASSWORD=thepassword
MAIL_ENCRYPTION=ssl

更新

看起来上面的方法是Laravel 4。如果你知道如何使用Laravel 5+获取错误代码,我可以认为它是正确的答案。

【问题讨论】:

    标签: php laravel email


    【解决方案1】:

    您可以为此使用 try catch,但您也误认为使用 $email, $email_from, $email_name, $subject 而不传递到函数范围。

    try{
        $mail_status = Mail::send( 'emails.followup', $data, function( $message ) use ($data, $email, $email_from, $email_name, $subject) {
                            $message->to( $email )
                            ->from( $email_from, $email_name )
                            ->subject( $subject );
                        });
        //If error from Mail::send
        if($mail_status->failures() > 0){
            //Fail for which email address...
            foreach(Mail::failures as $address) {
                print $address . ', ';
            }
            exit;
        }  
    }
    catch(\Exception $e){
        // Get error here
        print $e->getMessage();
        exit;
    }
    

    添加了电子邮件地址的失败打印以检查哪个地址的电子邮件失败。

    【讨论】:

    • @user1506104:检查这个答案,希望你能从中得到解决方案
    • 你好。这没有用。还有其他建议吗? @AddWeb
    • print $e->getMessage(); 对你有什么作用?
    • 也不例外。 $mail_status 为 0(假)。这意味着,没有发送任何内容。对吗?
    • 添加失败案例现在检查
    【解决方案2】:

    Mail::send() 之后立即检查Mail::failures() 将返回您尝试向其发送电子邮件的失败电子邮件地址数组。

    但是,据我所知,您无法使用 Mail 门面获得确切的失败错误。为此,您需要在 .env 上设置 debug true 并检查 Laravel 日志。

    【讨论】:

    • 日志也没有给我任何东西。谢谢你的建议。 +1
    【解决方案3】:
    1. 要获取开发版本的错误(在屏幕上),请在您的 .env 文件中设置APP_DEBUG=true
    2. 要获得确切的消息,请尝试捕获,但捕获 Swift_TransportException https://stackoverflow.com/a/42221501/2119863
    3. 如果需要,您还可以通过app('mailer') 获取邮件程序实例并在那里进行一些研究。

    这是一个工作示例:

    try{
        $mail_status = Mail::send( 'emails.followup', $data, function( $message ) use ($data) {
            $message->to( $data['email'] )
            ->from( $data['email_from'], $data['email_name'] )
            ->subject( $data['subject'] );
        });
    }catch(\Swift_TransportException $e){
        dd($e, app('mailer'));
    }
    

    dd() 结果:

    Swift_TransportException {#237 ▼
      #message: """
        Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required\r\n
        "
        """
      #code: 530
      #file: ...
    

    【讨论】:

      【解决方案4】:

      您想在 catch 中使用带有 Swift_TransportException 异常的 try catch 块,然后针对该异常调用 getCode()

      无论您的.env 设置如何,您始终可以在传递给catch 回调的异常上调用getCode()。这将返回您的异常代码。

      我建议在你的 catch 中使用\Swift_TransportException,因为 Laravel 使用了 Symfony 的 Swift Mailer,这些是它抛出的异常类型;但是,它确实在更深层次上扩展了Exception,因此您也可以使用\Exception

      这是一个例子:

      try {     
          insert mail code here ...           
      } 
      catch(\Swift_TransportException $e) { // alternatively use \Exception
          // dump error
          dd($e->getCode());
      }
      

      上述代码块将转储传递给其构造函数的Swift_TransportException 代码。如果你想要完整的错误信息,你也可以运行getMessage()

      您可以找到 Exception 类和后续 Swift_TransportException here 的完整文档,了解您可能想要使用的任何其他方法。


      编辑:Laravel 4 及更高版本支持此功能(包括 5+ 根据要求)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-06
        相关资源
        最近更新 更多