2011-03-31 11 views
6

Estoy utilizando la función de correo de php() para el simple proceso de enviar por correo electrónico la entrada de un formulario de contacto a la persona correspondiente. Lo extraño es que la forma siempre se utiliza para procesar los correos electrónicos, pero un día todo esto se detuvo, ahora la función devuelve falso, pero no da ningún error.PHP mail() función que devuelve falso, pero sin error

El sitio está en un host compartido. Cuando se les preguntó acerca de esto, recomendaron usar el smtp relay xx.xxx.x.xxx

Corregirme si estoy equivocado, pero la función mail() no proporciona disposiciones para esto, ¿verdad? Seguramente depende de la máquina HOST tener sus relés configurados correctamente?

Mi pregunta es esta: ¿Esto parece un error con la configuración del host, o es mi código? Este es un ejemplo del código electrónico que he utilizado:

$to = "[email protected]"; //to who? 
$subject = "Website Contact: $mysubject"; 
$headers .= "MIME-Version: 1.0\r\n"; 
$headers .= "From: $fname<$email1>\r\n"; 
$headers .= "Reply-To: $email1\r\n"; 
$headers .= "Return-Path:$email1\r\n"; 
$headers .= "Content-Type: text/html; charset=UTF-8\r\n"; 
$headers .= "Content-Transfer-Encoding: quoted-printable\r\n"; 
$msg2 = nl2br($msg); 

$send = mail($to, $subject, $msg2, $headers); //process mail 

if(!$send): 
    //error stuff here 
endif; 

Muchas gracias, Simon

@eisberg - Uso un manipulador personalizado así:

//error handler function 
function customError($errno, $errstr){ 
$err = "\n".date('Y-m-d H:m:s')." Error: [$errno] $errstr"; 
$fh = fopen("errlog.txt", 'a+'); 
fwrite($fh, $err); 
fclose($fh); 
} 
set_error_handler("customError", E_ALL); 

Would eso significa que necesito cambiar set_error_handler("customError", E_ALL); a set_error_handler("customError", -1);?

+0

prueba ** error_reporting (-1); ** encima de tu código. Espero que recibas un mensaje útil. Fuente: http://php.net/manual/en/function.error-reporting.php – eisberg

+0

@eisberg - Tengo una función de error personalizada registrando todos los errores (E_ALL) en el archivo, ¡y todavía nada! Recoge los errores más delicados, pero todavía no hay nada relacionado con mail(). – SimonDowdles

+0

'E_ALL' no es' -1' en todas las versiones de PHP :-) – eisberg

Respuesta

7

Suena como su host deshabilitado mail(), debe considerar usar SMTP para enviar correo, una buena clase de correo PHP como SwiftMailer le permitirá enviar correo a través de SMTP fácilmente. función

+0

gracias por ese útil recurso. Seguramente parece un mejor enfoque en general. Al menos puedo confiar en los detalles de la cuenta SMTP de los clientes, ya que me opongo a confiar en un servidor compartido que funciona como un desastre. Gracias una vez más. – SimonDowdles

17

electrónico() devolver falsa, pero sin error

Bienvenido a PHP!

¿Esto parece un error con la configuración del host, o es mi código?

¿Quién sabe? mail() es una caja negra de la cual no encontrará información útil cuando algo vaya mal.

Cuando se le preguntó acerca de esto, se recomienda el uso de retransmisión SMTP ...

De hecho, es probable que debería. Eche un vistazo al SwiftMailer, una biblioteca de correo PHP excelente, completa y moderna que puede hablar directamente con ese servidor SMTP. Se destaca en la creación de mensajes MIME, como el que parece haber armado cuidadosamente arriba.

Otras opciones populares incluyen PEAR's Mail, Zend Framework's Zend_Mail, y el clásico de los clásicos, PHPMailer.

+1

+1 para recomendar SwiftMailer, sin lugar a dudas la biblioteca de PHP Mailer más completa disponible y en desarrollo activo. – ChrisR

+0

Caja negra de negrura, jaja. –

+1

SwiftMailer es lo que he decidido ejecutar, eche un vistazo a lib y docs, y es tan simple de usar como la función de correo de php() es romperse. – SimonDowdles

1

Es más probable que sea una configuración de host. Creo (pero puede estar equivocado) que mail() usa el comando de correo del servidor. Entonces, si no tienes sendmail/postfix/ssmtp u otro MTA instalado en el servidor, no puede funcionar.
Si le pidieron que se dirigiera directamente a un servidor SMTP, debe usar otra biblioteca que implemente el protocolo SMTP y una clase Mail para compilar y enviarlo vía SMTP directamente (en las clases PHP de PEAR o Zend Framework)

1

Debería echar un vistazo a los registros de correo. Ellos tienen la respuesta. Sin embargo, es probable que tengas que luchar con tu empresa de hosting por los registros.

+0

ni siquiera vamos allí, dicen que "no pueden acceder directamente a ellos", lo que significa que probablemente estén vendiendo espacio de alojamiento que está en un servidor en el otro extremo del mundo y que en realidad no tienen idea de lo que están haciendo. Enfoque SMTP será. – SimonDowdles

+0

@webfac En ese caso, SMTP está bien :) – vbence

0

Compruebe si la web puede enviar correo dando getsebool httpd_can_sendmail desde la terminal. Si la salida es

httpd_can_sendmail --> off 

dan https el permiso para enviar correo mediante la emisión de comandos setsebool httpd_can_sendmail 1 . Debe tener el permiso de root para emitir estos comandos.

0

Tuve un problema similar y mi sitio está alojado por el servicio de alojamiento compartido. Pude resolver el problema al arreglar el encabezado. El problema era:

$ headers. = "From: $ fname \ r \ n";

Has usado el correo electrónico del usuario en el campo de. Mi alojamiento solo acepta correos electrónicos con mi nombre de dominio para este campo. Así que lo reemplacé con esto:

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

¡Y solucionó el problema! PHP mail() funciona bien después de eso.