【问题标题】:Can't stop SwiftMailer Exceptions Being Displayed to Browser in Laravel无法阻止在 Laravel 中向浏览器显示 SwiftMailer 异常
【发布时间】:2014-01-20 16:18:27
【问题描述】:

我正在使用 Laravel 作为网站。我有一个用户可以联系我的页面。这会使用 SwiftMailer 捆绑包向我发送一封电子邮件。我刚刚注意到在尝试发送消息时出现以下错误

Fatal error: Uncaught exception 'Swift_TransportException'

从这里抛出异常/Applications/MAMP/htdocs/yooies_site/bundles/swiftmailer/library/classes/Swift/Transport/Esmtp/AuthHandler.php on line 176

此位置的代码是:

  throw new Swift_TransportException(
'Failed to authenticate on SMTP server with username "' .
$this->_username . '" using ' . $count . ' possible authenticators'
);

错误的原因不用担心(我发现我更改了我的邮件密码并忘记更改我的站点电子邮件配置)

我遇到的问题是我设置了 Laravel 来记录任何异常,而不是在主页上显示它们。我的 error.php 配置文件中有以下设置

'detail' => false,
'log' => true,

那为什么我的网站在页面上显示异常而不是 500 错误?

此处的完整堆栈跟踪(注意我已删除我的站点真实名称并替换为“站点”

致命错误:未捕获的异常“Swift_TransportException” 带有消息“无法使用 2 个可能的身份验证器在用户名“info+site.com”的 SMTP 服务器上进行身份验证” 在 /Applications/MAMP/htdocs/site/bundles/swiftmailer/library/classes/Swift/Transport/Esmtp/AuthHandler.php:176 堆栈跟踪: #0 /Applications/MAMP/htdocs/site/bundles/swiftmailer/library/classes/Swift/Transport/EsmtpTransport.php(307): Swift_Transport_Esmtp_AuthHandler->afterEhlo(Object(Swift_SmtpTransport)) #1 /Applications/MAMP/htdocs/site/bundles/swiftmailer/library/classes/Swift/Transport/AbstractSmtpTransport.php(124): Swift_Transport_EsmtpTransport->_doHeloCommand() #2 /Applications/MAMP/htdocs/site/bundles/swiftmailer/library/classes/Swift/Mailer.php(79): Swift_Transport_AbstractSmtpTransport->start() #3 /Applications/MAMP/htdocs/site/application/libraries/personal/mailer.php(55): Swift_Mailer->send(Object(Swift_Message)) #4 /Applications/MAMP/htdocs/site/application/config/error.php(91): Personal\Mai 在 /Applications/MAMP/htdocs/site/bundles/swiftmailer/library/classes/Swift/Transport/Esmtp/AuthHandler .php 在第 176 行

Laravel 版本是 L3。

在此处捆绑 URL http://bundles.laravel.com/bundle/swiftmailer

【问题讨论】:

  • 假设 Laravel 将不得不做一些事情,基于异常未被捕获 - 即使 Laravel 自己做catch,它也不会完成控制器中的代码。如果您在现场,您可以用try 结束通话并记录,如果您在开发中,请重新throw?
  • 问题是,Laravel 已经处理了这个问题,但由于某种原因,不是因为这个 swift mailer 异常。我更愿意在 laravel 中找到根本原因并进行修改以确保捕获到异常
  • 好的,+1。我对 Laravel 不熟悉,但如果你有任何自己的用于这个包的控制器代码,可能值得编辑它。或者这个包是否可以独立工作,路由和所有?
  • 这是一个开源包。如果我能弄清楚 laravel 如何真正防止输出异常,那就太好了。然后我希望自己可以追踪问题
  • 文档中有什么内容吗?我自己没有看过这些文档,所以不确定它们有多详尽。

标签: php laravel swiftmailer


【解决方案1】:

Swiftmailer 不涉及任何负责显示错误的配置。对生产服务器的建议是有display_errors = Off和display_startup_errors = Off,可以设置为php.ini、httpd.conf、.htaccess、.user.ini等,甚至使用ini_set()。您应该确保正确设置了这些指令。

我不熟悉 Laravel 如何处理异常和错误,但看起来 Swift_TransportException 是在 Laravel 的错误处理过程之外抛出的。您能否指出异常在应用程序流程中的哪个位置引发?也许是堆栈跟踪?

PS:提示:发送电子邮件之类的事情最好不要在请求期间完成。您可以将其卸载到某种队列,并让服务器上的另一个进程处理它。你可以看看Gearman这个。

更新

查看堆栈跟踪,似乎 Laravel 确实捕获了异常,因为调用了 Log::exception();(在 application/config/error.php 第 91 行)。但痕迹并没有揭示它是如何到达那里的。也许您可以在安装了Xdebug 的开发机器上运行它。 Xdebug 会在抛出异常时为您提供更精确的堆栈跟踪,以 public/index.php 结尾(请求开始的地方)。

【讨论】:

  • 堆栈跟踪添加到问题
  • 啊!我刚刚解决了!!在error.php 91,我有一个日志功能,可以对捕获的任何异常做出反应。在这里,我给自己发了一封电子邮件。所以它捕获了一个电子邮件错误,然后尝试发送一封电子邮件,这会产生另一个异常。我会为此给你赏金,因为它帮助我找到了答案——我知道这一定是我忽略的一些愚蠢的事情。感谢您的帮助。
  • 不错的收获!第二个异常确实会在 Laravel 的错误处理过程之外被抛出 :) 随时用你的最终发现编辑我的答案!
猜你喜欢
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2012-04-16
  • 2015-02-14
  • 1970-01-01
相关资源
最近更新 更多