2010-03-05 4 views
34

Я пытаюсь использовать PHPMailer для небольшого проекта, но я немного запутался в обработке ошибок с помощью этого программного обеспечения. Надеюсь, что у кого-то есть опыт. Когда я установил электронное письмо, и я использую:Обработка ошибок с помощью PHPMailer

$result = $mail->Send(); 

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

Который работает нормально, более или менее. Проблема заключается в том, что есть ошибка, PHPMailer также, похоже, повторяет ошибку, поэтому, если есть проблема, она просто отправляет эту информацию непосредственно в браузер, по сути нарушая любую обработку ошибок, которую я пытаюсь сделать.

Is ? есть ли способ, чтобы заставить замолчать эти сообщения его не бросать исключение, его просто распечатав ошибку, которая в моем тестовом случае является:

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

его означало быть ошибка, но она должна проживать в $ почте -> ErrorInfo, не выбрасывается программным обеспечением.

ответ

84

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! 
} 
+19

Я уже пытался поймать его с исключениями, часть, которую я пропустил, была «new PHPMailer (true)», которая фактически разрешает исключения. Спасибо за помощь. – Stomped

+0

для меня .. эти строки имеют ошибки .. $ mail-> MsgHTML (file_get_contents ('contents.html')); $ mail-> AddAttachment ('images/phpmailer.gif'); // attachment $ mail-> AddAttachment ('images/phpmailer_mini.gif'); // прикрепление, как я могу это исправить .. спасибо .. – pcs

+2

Это не хорошо. Даже при обработке исключений вы все равно должны поместить подтверждение «« Отправлено сообщение «ОК» в «условное», иначе это приведет к вводящим в заблуждение подтверждениям, что все в порядке, когда на самом деле что-то пошло не так. Поэтому используйте, например: if ($ mail-> Send()) {echo "E-mail отправлено OK
"; } ' –

3

Мы написали класс оболочки, который захватывает буфер и преобразует печатный результат в исключение. это позволяет нам обновлять файл phpmailer, не задумываясь о том, чтобы комментировать события echo при каждом обновлении.

Класс обертки имеет методы что-то вдоль линий:

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); 
    } 
} 
3

Даже если вы используете исключения, то по-прежнему вывод ошибок.
Вы должны установить $ MailerDebug к ложному которым должен выглядеть следующим образом

$mail = new PHPMailer(); 
$mail->MailerDebug = false; 
+2

Просто примечание об этом было удалено: Version 1.25 (Mon, Jul 02 2001) * Добавлена ​​улучшенная обработка ошибок, добавив переменную $ ErrorInfo * Удаленная переменная MailerDebug (устаревшая с новым обработчиком ошибок) –

2

это работает отлично

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 
} 
1

В PHPMailer.php, есть строки как указано ниже:

echo $e->getMessage() 

Просто прокомментируйте эти строки, и вам будет хорошо идти.

1
$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!'; 
} 

самый простой способ для обработки электронной почты отправки успешных или ...

+4

Вам следует добавить $ mail-> ErrorInfo в случае else для отображения ошибок. – Westy92

+0

Это отправная точка исходного вопроса - вопрос задается только потому, что этого недостаточно. – pgr

15

Просто пришлось исправить это сам. В приведенных выше ответах, по-видимому, не учитывается опция $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, чтобы подавить ошибки и редактировать «поймать» часть вашего кода, как описано выше.

+0

Если это еще не работает, перейдите для '$ mail-> SMTPDebug = 4;' - это покажет каждый шаг PHPMailer – Mave

+0

Но как вы регистрируете ошибку smtp connect? –

14

Обратите внимание! Вы должны использовать следующий формат при создании PHPMailer!

$mail = new PHPMailer(true); 

Если вы не исключаете исключения, и единственное, что вы получите, это эхо от рутины! Я знаю, что это хорошо после того, как это было создано, но, надеюсь, это поможет кому-то.

+3

и уже упоминалось в принятом ответе ... – WOUNDEDStevenJones

+0

@WOUNDEDStevenJones Я боролся с принятым ответом. Возможно, я не читаю достаточно близко, но в любом случае этот ответ мне помог. – Goose

10

Подробную информацию об ошибке можно получить по методу $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.

Это происходит с главной страницы PHPMailer по github https://github.com/PHPMailer/PHPMailer.

+0

Мне это нравится, потому что вам не нужно передавать аргументы конструктора и не выхватывать исключения. –