web-dev-qa-db-ja.com

PHPMailerでのエラー処理

私は小さなプロジェクトでPHPMailerを使用しようとしていますが、このソフトウェアでのエラー処理について少し混乱しています。誰かがそれを経験してくれることを願っています。メールを設定して使用する場合:

$result = $mail->Send();

if(!$result) {
    // There was an error
    // Do some error handling things here
} else {
    echo "Email successful";
}

それは多かれ少なかれ、うまく動作します。問題は、エラーが発生したとき、PHPMailerもエラーをエコー表示するように見えるため、問題がある場合は、その情報をブラウザに直接送信するだけで、基本的にエラー処理を中断します。

これらのメッセージを黙らせる方法はありますか?私のテストケースでは、例外をスローせず、エラーを出力するだけです:

invalid address: @[email protected] You must provide at least one recipient email address.

エラーを意味しますが、$ mail-> ErrorInfoにあるはずです。ソフトウェアによってエコーアウトされない。

43
Stomped

PHPMAilerは例外を使用します。次の code を採用してください:

require_once '../class.phpmailer.php';

$mail = new PHPMailer(true); //defaults to using php "mail()"; the true param means it will throw exceptions on errors, which we need to catch

try {
  $mail->AddReplyTo('[email protected]', 'First Last');
  $mail->AddAddress('[email protected]', 'John Doe');
  $mail->SetFrom('[email protected]', 'First Last');
  $mail->AddReplyTo('[email protected]', 'First Last');
  $mail->Subject = 'PHPMailer Test Subject via mail(), advanced';
  $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
  $mail->MsgHTML(file_get_contents('contents.html'));
  $mail->AddAttachment('images/phpmailer.gif');      // attachment
  $mail->AddAttachment('images/phpmailer_mini.gif'); // attachment
  $mail->Send();
  echo "Message Sent OK\n";
} catch (phpmailerException $e) {
  echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Boring error messages from anything else!
}
98
Phil Rykoff

メソッド_$mail->ErrorInfo_を使用して、エラーに関する詳細情報を取得できます。例えば:

_if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}
_

これは、new PHPMailer(true)でアクティブにする必要がある例外モデルの代替です。ただし、例外モデルを使用できる場合は、@ Phil Rykoffの回答として使用します。

これは、githubのPHPMailerのメインページにあります https://github.com/PHPMailer/PHPMailer

20
PhoneixS

ご注意ください!!! PHPMailerをインスタンス化するときは、次の形式を使用する必要があります!

$mail = new PHPMailer(true);

例外を無視しない場合、取得できるのはルーチンからのエコーだけです!これが作成された後はこれで十分ですが、うまくいけば誰かの助けになるでしょう。

16
PhilMDev

これを自分で修正する必要がありました。上記の答えは_$mail->SMTPDebug = 0;_オプションを考慮していないようです。質問が最初に尋ねられたときには利用できなかったかもしれません。

PHPMailサイトからコードを取得した場合、デフォルトは$mail->SMTPDebug = 2; // enables SMTP debug information (for testing)になります

https://github.com/Synchro/PHPMailer/blob/master/examples/test_smtp_gmail_advanced.php

上記のように、値を0に設定してエラーを抑制し、コードの「キャッチ」部分を編集します。

16
Simon Roberts

バッファをキャプチャし、印刷出力を例外に変換するラッパークラスを作成しました。これにより、アップグレードのたびにechoステートメントをコメントアウトすることなく、phpmailerファイルをアップグレードできます。

ラッパークラスには、次の行に沿ったメソッドがあります。

public function AddAddress($email, $name = null) {
    ob_start();
    parent::AddAddress($email, $name);
    $error = ob_get_contents();
    ob_end_clean();
    if( !empty($error) ) {
        throw new Exception($error);
    }
}
4
Charlie Shehadi

例外を使用しても、エラーが出力されます。
このように見えるはずの$ MailerDebugをFalseに設定する必要があります

$mail = new PHPMailer();
$mail->MailerDebug = false;
3
Fred

これは正常に動作します

use try { as above

use Catch as above but comment out the echo lines
} catch (phpmailerException $e) { 
//echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {   
//echo $e->getMessage(); //Boring error messages from anything else!
}

次にこれを追加します

if ($e) {
//enter yor error message or redirect the user
} else {
//do something else 
}
2
Patdundee

PHPMailer.phpには、次のような行があります。

echo $e->getMessage()

これらの行をコメントするだけでいいでしょう。

1
Haris ur Rehman
$mail = new PHPMailer();

$mail->AddAddress($email); 
$mail->From     = $from;
$mail->Subject  = $subject; 
$mail->Body     = $body;

if($mail->Send()){
    echo 'Email Successfully Sent!';
}else{
    echo 'Email Sending Failed!';
}

メール送信の成功または失敗を処理する最も簡単な方法...

0
Prince-W