2010-03-05 75 views
34

Estoy tratando de usar PHPMailer para un proyecto pequeño, pero estoy un poco confundido acerca del manejo de errores con este software. Esperando que alguien tenga experiencia con eso. Cuando he configurado un correo electrónico y uso:Error al manejar con PHPMailer

$result = $mail->Send(); 

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

Que funciona bien, más o menos. El problema es que cuando hay un error, PHPMailer también parece repetir el error, por lo que si hay un problema, simplemente envía esa información directamente al navegador, esencialmente rompiendo cualquier error de manejo que estoy tratando de hacer.

Es ? hay una manera de silenciar estos mensajes su no lanzan una excepción, es sólo imprimir el error, que en mi caso de prueba es:

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

que va a ser un error, pero debe ser residente en $ electrónico -> ErrorInfo; no está siendo echo por el software.

Respuesta

84

PHPMAiler usa Excepciones. Intente adoptar el siguiente 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

Ya había intentado atraparlo con excepciones, la parte que había omitido era 'nuevo PHPMailer (verdadero)' que realmente permite las excepciones. Gracias por tu ayuda. – Stomped

+0

para mí ... estas líneas tienen errores ... $ mail-> MsgHTML (file_get_contents ('contents.html')); $ mail-> AddAttachment ('images/phpmailer.gif'); // archivo adjunto $ mail-> AddAttachment ('images/phpmailer_mini.gif'); // archivo adjunto, ¿cómo puedo solucionarlo ... gracias ... – pcs

+2

Esto no es bueno. Incluso con el manejo de excepciones, aún debe poner la confirmación '' Mensaje enviado OK \ n "' dentro de un condicional, de lo contrario, dará lugar a confirmaciones engañosas diciendo que está bien cuando realmente algo salió mal. Por lo tanto, use, por ejemplo: 'if ($ mail-> Send()) {echo" Correo electrónico enviado OK
"; } ' –

3

Escribimos una clase de contenedor que captura el búfer y convierte la salida impresa en una excepción. esto nos permite actualizar el archivo phpmailer sin tener que recordar comentar las declaraciones de eco cada vez que actualizamos.

La clase contenedora tiene métodos algo en la línea de:

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

incluso si se utiliza excepciones, los errores todavía de salida.
Usted tiene que fijar $ MailerDebug a wich Falso debería tener este aspecto

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

Solo una nota esto ha sido eliminado: Versión 1.25 (Lun, Jul 02 2001) * Se ha mejorado el manejo de errores al agregar una variable $ ErrorInfo * Se eliminó la variable MailerDebug (obsoleta con el nuevo controlador de errores) –

2

Ésta funciona bien

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

A continuación, agregue este

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

En PHPMailer.php, hay líneas de la siguiente manera:

echo $e->getMessage() 

Simplemente comente estas líneas y estará listo para comenzar.

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

la forma más sencilla de manejar el envío de correo electrónico correcta o errónea ...

+4

Debe agregar $ mail-> ErrorInfo al caso else para mostrar errores. – Westy92

+0

Este es el punto de partida de la pregunta original: la pregunta solo se hace, ya que esto no es suficiente. – pgr

15

sólo tenía que arreglar esto a mí mismo. Las respuestas anteriores no parecen tener en cuenta la opción $mail->SMTPDebug = 0;. Es posible que no haya estado disponible cuando se formuló la pregunta por primera vez.

Si tienes tu código desde el sitio PHPMail, el valor por defecto será $mail->SMTPDebug = 2; // enables SMTP debug information (for testing)

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

establece el valor en 0 para suprimir los errores y editar la parte 'captura' de su código como se explica encima.

+0

Si eso todavía no funciona, ve por '$ mail-> SMTPDebug = 4;' - esto mostrará todos y cada uno de los pasos que hace el contador de fallas de PHPMailer – Mave

+0

¿Pero cómo se registra el error de smtp connect? –

14

Tenga en cuenta! ¡Debe usar el siguiente formato al crear instancias de PHPMailer!

$mail = new PHPMailer(true); 

Si no se ignoran las excepciones, ¡lo único que obtendrá es un eco de la rutina! Sé que esto está bien después de que esto fue creado pero espero que ayude a alguien.

+3

y ya se ha mencionado en la respuesta aceptada ... – WOUNDEDStevenJones

+0

@WOUNDEDStevenJones Tuve problemas con la respuesta aceptada. Quizás no leo lo suficientemente cerca, pero de cualquier manera esta respuesta me ayudó. – Goose

10

Puede obtener más información sobre el error con el método $mail->ErrorInfo. Por ejemplo:

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

Esta es una alternativa al modelo de excepción que necesita a activo con new PHPMailer(true). Pero si puede usar el modelo de excepción, úselo como respuesta @Phil Rykoff.

Esto viene de la página principal de PHPMailer en github https://github.com/PHPMailer/PHPMailer.

+0

Me gusta esto, porque no tiene que pasar argumentos de constructor ni detectar expcepciones. –