2011-02-06 13 views
9

Estoy escribiendo una secuencia de comandos de registro de PHP bastante simple que utiliza la función mail() de PHP para enviar al usuario un enlace de activación.Captura de errores de PHP mail() y muestra un mensaje de error de usuario razonable

El problema es que puedo detectar los errores normales, como el formato del correo electrónico, pero una vez que se dispara al servidor y dice que un usuario ingresó una dirección de correo electrónico que falla, no sé cómo detectar este error y decirle al usuario qué sucedió.

Por ejemplo, en el momento en que sale esto:

Warning: mail() [function.mail]: SMTP server response: 554 : Recipient address rejected: Relay access denied in ** on line 70

Alguna idea de lo que podría hacer acerca de los errores de este tipo? Soy consciente de usar el símbolo @ para suprimir el error, pero quiero hacer más que eso y manejar el problema.

Respuesta

21

Utilizar el valor booleano para detectar un error:

$success = @mail(...); 

a continuación, desea saber qué error interno que causó el problema, a fin de utilizar:

$error = error_get_last(); 
preg_match("/\d+/", $error["message"], $error); 
switch ($error[0]) { 
    case 554: 
     ... 
    default: 
     ... 

Tenga en cuenta que esto funciona con PHP 5.2 hacia adelante solamente

No hay forma de verificar la entrega o ver correos de error de transporte con PHP. Necesitarías un controlador de sondeo pop3 para eso.

+2

gracias por publicar una respuesta real a esto :) –

0

que se desea capturar tanto como sea posible antes de enviarlo fuera el correo, desinfectar sus entradas para asegurarse de que realmente es lo que se espera que sea

Puede utilizar filter_var para comprobar que la dirección de correo electrónico realmente es una dirección, cheque que los enteros cae dentro de su rango permitido, etc.

Ajuste el encabezado del correo desde la dirección a un lugar donde se puede comprobar por las entregas fallidas:

$headers = 'From: [email protected]' . "\r\n"; 

puede ALS o comprobar que el correo se realiza como se esperaba:

if(mail($to,$subject,$message)) 

Y una última cosa, es probable que no quiere display warnings en un entorno real, puede activar los apagado, ya sea a través del archivo ini o usando ini_set.

+0

cosas verdaderas, pero no una respuesta a la pregunta. también hay cosas que pueden causar errores de smtp que simplemente no puedes anticipar. por ejemplo listas de bloqueo de spam. –

-2

Lo mejor sería utilizar una biblioteca como Swift Mailer que arroje excepciones que puedan manejarse fácilmente.

+4

esto es una cura para el problema, pero no es una respuesta a cómo resolverlo usted mismo. hay bibliotecas disponibles para casi todo ahora y, por supuesto, pueden ahorrar mucho trabajo. pero es una lástima ver que las personas pierden la capacidad de resolver problemas básicos por sí mismas porque simplemente ya no conocen los principios básicos del lenguaje de programación en el que trabajan. –

+0

Cierto, no es una respuesta a la pregunta, pero sugiere una forma de abordarlo el problema más pragmáticamente. – Jan

Cuestiones relacionadas