对于一个项目(涉及房地产)我已经包含一个联系表格,如果访客有兴趣购买/租用房地产,访客可以联系房地产经纪人。
我正在使用Symfony2及其库。对于联系邮件,我使用的是Swiftmailer库。 好吧,我有下一个处理表单提交的代码。在那里,我创建了一个邮件对象,以便能够发送邮件。它有效,但如果发送方/接收方的smtp主机出现问题,我想提供一个解决错误的服务。
这是代码,
$data = $contactForm->getData();
try {
// create body text
$body = $app['twig']->render('mailTemplate.twig', array('data' => $data, 'immoid' => $immoID));
// set mail
$mail = \Swift_Message::newInstance()
->setSubject('Contact reaction on your immo offer.')
->setFrom($app['swiftconfig']['sender'])
->setTo($contactinfo['contactmail'])
->setBody($body, 'text/html');
// send mail
$app['mailer']->send($mail);
// redirect if successfull
$app->redirect($app['url_generator']->generate('immoDetail', array('immoID' => $immoID)));
}
catch (Swift_TransportException $STe) {
// logging error
$string = date("Y-m-d H:i:s") . ' - ' . $STe->getMessage() . PHP_EOL;
file_put_contents("errorlog.txt", $string, FILE_APPEND);
// send error note to user
$errorMsg = "the mail service has encountered a problem. Please retry later or contact the site admin.";
}
catch (Exception $e) {
// logging error
$string = date("Y-m-d H:i:s") . ' - GENERAL ERROR - ' . $e->getMessage() . PHP_EOL;
file_put_contents("errorlog.txt", $string, FILE_APPEND);
// redirect to error page
$app->abort(500, "Oops, something went seriously wrong. Please retry later !");
}
($ app ['swiftconfig'] ['sender'] =来自主机的mailaddress / $ contactinfo ['contactmail'] =来自网站访问者的mailaddress(以联系方式提交))
现在,当smtp主机不起作用时,Swiftmailer会发送异常,但是try-catch块没有捕获它。该功能正在继续。 即使是root try-catch块(在app.php中)也没有捕获它。因此,您会在网页上看到一个很大的PHP错误,这不应该发生。来自它的消息在下面描述,
SCREAM: Error suppression ignored for
---
Fatal error: Uncaught exception 'Swift_TransportException' with message ' in C:\...\vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php on line 266
---
Swift_TransportException: Connection could not be established with host <output omitted>
有谁知道为什么try catch块没有捕获自定义异常?我已经调查了类文件和进度,但我没有看到任何异常活动。
我希望有人可以提供解决方案,因为PHP错误不应出现在网站页面上。
答案 0 :(得分:11)
从您的config.yml 中删除
spool: { type: memory }
然后你将添加像这样的try catch
try{
$mailer = $this->getMailer();
$response = $this->getMailer()->send($message);
}catch(\Swift_TransportException $e){
$response = $e->getMessage() ;
}
答案 1 :(得分:4)
执行$app['mailer']->send($mail);
时,如果您已打开假脱机,则此时不会发送电子邮件。见http://symfony.com/doc/current/cookbook/email/spool.html
如果您的默认设置为spool: { type: memory }
,则在控制器退出后,在内核终止阶段将抛出\Swift_TransportException
。
解决此问题的一种方法是关闭假脱机(但是您的用户可能必须在发送电子邮件时等待),或者您可以创建自己的事件监视器来处理异常。 http://symfony.com/doc/current/cookbook/service_container/event_listener.html
答案 2 :(得分:1)
当我向Monolog添加一个SwiftMailerHandler时,我在Laravel 4.2中遇到了这个问题,因此它会向我发送任何在某个级别或更高级别记录的内容。我无法在处理程序中捕获异常并将其抛回浏览器。我通过继承SwiftMailerHandler来解决它:
/path/to/mypkg
此处理程序捕获SwiftMailer异常并将其记录在临界级别,因此它不会丢失。我没有收到有关它的电子邮件,但至少它在日志中。
我很惊讶地发现SwiftMailerHandler无法在send方法中注入异常处理程序,但幸运的是代码编写得非常好,使得这个解决方案非常简单。
效果很好,到目前为止我没有遇到任何麻烦。
答案 3 :(得分:1)
尝试在Exception前面加上反斜杠。
catch(\Exception $e)
类名开头之前的\(反斜杠)表示Global Namespace。
使用反斜杠将确保在全局名称空间内调用Exception。
答案 4 :(得分:0)
当然你有最新版的swiftmailer? Line 226 of StreamBuffer.php不会抛出任何异常。 This version from 2 years ago确实会在该特定行上抛出异常。
我会尝试运行最新版本,然后再深入探讨这个问题。
答案 5 :(得分:0)
SCREAM是XDebug的设置,允许查看通常捕获或抑制的错误。 (例如,使用@。)搜索
xdebug.scream = 1
在你的php.ini中并将其设置为0。
答案 6 :(得分:0)
您可以在下面的代码中尝试自定义错误:
public function render($request, Exception $exception)
{
if ($exception instanceof \Swift_TransportException) {
return response()->view('errors.404');
}
return parent::render($request, $exception);
}