2010-02-24 18 views
25

¿Alguien sabe cómo puedo detectar un error de correo (se muestra un error al enviar el correo electrónico y el servidor de correo lo causa) en php?¿Cómo puedo detectar un error causado por mail()?

error que fue causado por emailserver abajo es el siguiente:

<!--2010-02-24T14:26:43+11:00 NOTICE (5): Unexpected Error: mail() [<a href='function.mail'>function.mail</a>]: Failed to connect to mailserver at "ip " port portip, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() (# 2).
2010-02-24 14:26:43
Username: admin
Error in line 439 of file D:\test.php
Script: /customer.php
[Global Error Handler]
-->

+1

¿Cómo se envían los correos? ¿Estás hablando con el servidor SMTP directamente? –

Respuesta

42

Esto es lo mejor que puede hacer:

if (!mail(...)) { 
    // Reschedule for later try or panic appropriately! 
} 

http://php.net/manual/en/function.mail.php

mail() returns TRUE if the mail was successfully accepted for delivery, FALSE otherwise.

It is important to note that just because the mail was accepted for delivery, it does NOT mean the mail will actually reach the intended destination.

Si necesita suprimir advertencias, puede usar:

if ([email protected](...)) 

Sin embargo, tenga cuidado al usar el operador @ sin las verificaciones apropiadas para saber si algo tiene éxito o no.


Si mail() errores no son suprimible (raro, pero no pueden probarlo ahora mismo), usted podría:

a) desactivar temporalmente errores:

$errLevel = error_reporting(E_ALL^E_NOTICE); // suppress NOTICEs 
mail(...); 
error_reporting($errLevel); // restore old error levels 

b) utilizar un programa de correo diferente, según lo sugerido por fire y Mike.

Si mail() resulta demasiado escamosa e inflexible, examinaría b). Desactivar los errores hace que la depuración sea más difícil y generalmente no es buena.

+3

+1 Buena respuesta. Muchas veces la gente olvida que 'mail()' devuelve un 'bool'. Es bueno que haya mencionado el supuesto de "si no hubo error, el correo llegó" también, ya que esto también es un error común entre los nuevos desarrolladores. – Sampson

+0

Hola deceze, entiendo que mail() devolverá verdadero o falso.Pero desconociendo la razón, esto siempre muestra el mensaje de error en mi página (que el mensaje de error muestra en mi pregunta anterior y el error solo se puede ver cuando veo el código fuente de la página): y este error me ha impedido redirigir (encabezado()) mi página a la página nueva. He buscado el código pero no he podido averiguar dónde se muestra este error. Tal vez esto se establece en la configuración de php stmp? –

+0

Mi pregunta es ... ¿cómo puedo ignorar o arrojar este mensaje de error "No se pudo conectar al servidor de correo" desde el encabezado de mi página? ¿Alguien tiene idea de cómo hacerlo? He estado buscando en Google pero aún no he podido encontrar la solución –

1

Usted podría utilizar los PEAR Mail clases y métodos, que le permite comprobar si hay errores a través de:

if (PEAR::isError($mail)) { 
    echo("<p>" . $mail->getMessage() . "</p>"); 
} else { 
    echo("<p>Message successfully sent!</p>"); 
} 

puede encontrar un ejemplo here.

6

PHPMailer maneja muy bien los errores, también es una buena secuencia de comandos para utilizar para enviar correo a través de SMTP ...

if(!$mail->Send()) { 
    echo "Mailer Error: " . $mail->ErrorInfo; 
} else { 
    echo "Message sent!"; 
} 
+0

En realidad, creo que se hace eco de un error si no estableciste la propiedad de excepción como verdadera – AntonioCS

+0

Me zambullí en su código y solo usa el 'modo seguro' temporal + @mail() para manejar los errores. –

4

utilizando también http://php.net/error_get_last no le ayudará a cabo, porque el correo() no emmit sus errores en este función.

La única forma parece ser utilizar un anuncio publicitario adecuado, como ya se ha sugerido anteriormente.

+2

Este reclamo parece tener algún valor, 'mail' devuelve falso para mí, pero' error_get_last' es nulo. – yoshi

Cuestiones relacionadas