2011-06-19 38 views
20

Quiero crear un script de un formulario de registro simple con correo de activación, etc. Pero por algún motivo, mail() no envía los correos electrónicos, o mis 3 cuentas de correo electrónico diferentes (hotmail, gmail, yahoo) no los reciben y, por lo tanto, ni siquiera los colocan en la carpeta de spam.PHP mail() no funciona

Código:

<?php 
    $mailto = '[email protected]'; 
    $subject = 'the subject'; 
    $message = 'the message'; 
    $from = '[email protected]'; 
    $header = 'From:'.$from; 

    if(mail($mailto,$subject,$message,$header)) { 
     echo 'Email on the way'; 
    } 
?> 

Cada vez que se da salida a 'Correo electrónico en el camino' de modo electrónico() devuelve verdadero, ¿verdad? Realmente no lo entiendo, incluso he intentado apagar mi pequeña snitch (aunque no bloqueé SMTP).

+3

¿Está probando esto en su computadora local o en un servidor web real? Si está en su máquina local, lo más probable es que no esté configurado para enviar/recibir correo. – itsols

+0

¿Cómo se configura sendmail en su archivo php.ini? ¿Y esto está en * nix o Windows? –

+0

@ ETWW-Dave: me atrevo a encontrar 'sendmail' en una computadora reciente;) Pero sí, sospecho que el correo electrónico está siendo rechazado por el próximo servidor SMTP. – Piskvor

Respuesta

0

Compruebe su phpinfo y/o php.ini para la configuración de su correo y asegúrese de que puede enviar el correo con cualquier programa que php esté tratando de usar. La función tendrá éxito si el comando se ejecuta pero no sabe si el correo realmente se apagó.

0

Compruebe el registro de correo de su servidor de correo. En sistemas Unix-ish, generalmente es/var/log/maillog. En Windows, quién sabe, pero debería haber un registro en alguna parte. Si el correo devuelve TRUE, el servidor de correo al que se está conectando ha aceptado el correo para una eventual entrega. Después de eso, mail() ya no está involucrado de ninguna manera y corresponde a los servidores SMTP hacer la entrega real.

En términos del mundo real, mail() está caminando una letra por el bloque y colocándolo en un buzón. Todo después de eso está completamente fuera del alcance y control de PHP.

1

Es posible que necesite agregar caracteres correctos de fin de línea a los encabezados. Puede ser \n o \r\n

13

Ver this article by Jeff Atwood.

En resumen: El hecho de que su código haya entregado el correo electrónico a un Agente de transferencia de correo no significa que se entregará. Sí, mail() al devolver verdadero significa "aceptado para la entrega" - lo que significa "Parece un correo electrónico, voy a probar para entregar esto", no "Se entrega". Incluso the manual for mail() says:

Es importante tener en cuenta que sólo porque el correo fue aceptado para la entrega, lo hace NO significa que el correo realmente vaya a llegar al destino deseado.

Muchíiiiiiiiiisimo: comprobar su MTA (es la dirección de correo enviado desde el ordenador local?), Intente enviar a una dirección local (si la dirección es local, no se consigue entregado?), Intentará enviar una correo electrónico de su cliente de correo, utilizando la misma configuración que su script PHP, intente enviarlo a un proveedor de correo electrónico más pequeño que le permita desconectar el correo no deseado (¿se entrega fuera de su red?). Además, lea ese artículo y verifique los puntos mencionados allí.

4

Tal vez su servidor no está configurado para manejar mail().

<?php 
    print phpinfo(); 
?> 

y mirar sendmail_path

+13

¿qué sigue? el mío es _/usr/local/bin/phpsendmail_ – newbieguy

0

Si esto es un servidor Linux es probablemente configurado para enviar a la cola de correo local. Cuando tuve este problema lo conseguí trabajando agregando una entrada MX en el servidor DNS utilizado por los servidores de Linux que apuntaban al servidor de correo de nuestro ISP.