6

对于一个项目(关于房地产),我提供了一个联系表格,如果访客有兴趣购买/租用房地产,可以联系房地产经纪人。

我正在使用 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'] = 来自主机的邮件地址 / $contactinfo['contactmail'] = 来自站点访问者的邮件地址(以联系表格形式提交))

现在,当 smtp 主机不工作时,Swiftmailer 确实会发送一个异常,但 try-catch 块并没有捕捉到它。该功能正在继续。甚至根 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 错误不应该出现在网站页面上。

4

7 回答 7

16

从您的 config.yml 中删除 spool: { type: memory }

然后你将像这样添加try catch

    try{
        $mailer = $this->getMailer();
        $response = $this->getMailer()->send($message);
    }catch(\Swift_TransportException $e){
        $response = $e->getMessage() ;
    }
于 2014-02-20T20:22:51.627 回答
6

尝试在 Exception 前面加一个反斜杠。

catch(\Exception $e)

类名开头的 \(反斜杠)代表全局命名空间

使用反斜杠将确保在全局命名空间内调用异常。

于 2019-08-02T16:15:46.037 回答
5

当您这样做$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

于 2014-10-11T21:52:29.443 回答
1

当我向 Monolog 添加一个 SwiftMailerHandler 时,我在 Laravel 4.2 中遇到了这个问题,所以它会通过电子邮件将任何在某个级别或更高级别记录的内容发送给我。我无法在处理程序中捕获异常,它被扔回浏览器。我通过继承 SwiftMailerHandler 解决了这个问题:

<?php
/*******************************************************************************
* $Id: LogMailer.php 12152 2015-09-15 00:42:38Z sthames $ */
/**
* Subclass of Monolog SwiftMailerHandler that will catch exceptions SwiftMailer
* throws during the send. These exceptions are logged at the critical level.
* Without this, such exceptions are reported back to the browswer.
*******************************************************************************/
class LogMailer extends \Monolog\Handler\SwiftMailerHandler
  {
  /** Flag set when logging an exception during send. */
  protected $dont_mail = false;

  /** Overloads sender to catch and log errors during the send. */
  protected function send($content, array $records)
    {
    try
      {
      if (!$this->dont_mail)
        parent::send($content, $records);
      }
    catch(\Exception $e)
      {
      $this->dont_mail = true;
      Log::critical($e->getMessage());
      $this->dont_mail = false;
      }
    }
  }

此处理程序捕获 SwiftMailer 异常并将其记录在关键级别,因此它不会丢失。我没有收到有关它的电子邮件,但至少它在日志中。

我惊讶地发现 SwiftMailerHandler 无法将异常处理程序注入到 send 方法中,但幸运的是,代码编写得足够好,使这个解决方案变得非常简单。

效果很好,到目前为止没有给我带来任何麻烦。

于 2015-09-18T20:54:22.323 回答
0

确定您拥有最新版本的 swiftmailer?StreamBuffer.php 的第 226 行没有抛出任何异常。2 年前的这个版本确实在该特定行引发了异常。

在更深入地研究这个问题之前,我会尝试运行最新版本。

于 2013-07-29T10:07:36.063 回答
0

SCREAM 是 XDebug 的一个设置,它允许查看通常被捕获或抑制的错误。(例如,使用 @。)搜索

xdebug.scream = 1

在您的 php.ini 中并将其设置为 0。

于 2013-11-19T14:37:14.313 回答
0

you can try below code for custom error:

public function render($request, Exception $exception)
{
     if ($exception instanceof \Swift_TransportException) {
     return response()->view('errors.404');
}
     return parent::render($request, $exception);
}
于 2017-08-30T10:59:13.503 回答