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 内) でさえ、それをキャッチしていません。この結果、Web ページに大きな 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

5

$app['mailer']->send($mail);スプールがオンになっている場合、その時点で電子メール メッセージは送信されません。http://symfony.com/doc/current/cookbook/email/spool.htmlを参照してください

のデフォルト設定がある場合spool: { type: memory }\Swift_TransportExceptionコントローラーが終了した後、カーネル終了フェーズ中に がスローされます。これを回避する 1 つの方法は、スプーリングをオフにすることです (ただし、ユーザーは電子メールが送信されるまで待たなければならない場合があります)。または、独自のイベントリスナーを作成して例外を処理することもできます。http://symfony.com/doc/current/cookbook/service_container/event_listener.html

于 2014-10-11T21:52:29.443 に答える
1

SwiftMailerHandler を Monolog に追加したときに、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

SCREAM は、通常はキャッチまたは抑制されるエラーを表示できるようにする XDebug の設定です。(たとえば、@ を使用します。)

xdebug.scream = 1

php.ini でこれを 0 に設定します。

于 2013-11-19T14:37:14.313 に答える