2012-08-04 19 views
31

La función mail de PHP parece entregar correo en un sistema limpio, sin una configuración aparente realizada por el administrador o el webmaster (sin configuración SMTP en php.ini, etc.). ¿Cómo funciona la función mail para enviar correo a un servidor remoto?¿Cómo funciona el "correo" de PHP?

+0

¿Por qué se ha realizado esa configuración? A menos que se refiera a la entrega de correo al webmaster, no tiene sentido que el webmaster configure las cosas. – 11684

+0

Hace la pregunta incorrecta: no hay nada de malo en la función de correo electrónico() en PHP, no es poco confiable. El problema es el contenido y la distribución de tus correos. Una mejor pregunta sería '¿cómo puedo evitar que mis correos terminen en la carpeta de spam?'. – Repox

+0

dijo 'confiable' pero esto realmente no es una pregunta para ... aquí – Alex

Respuesta

22

En * nix invoca el sendmail binario, que luego utiliza la configuración de correo para enrutar el correo electrónico. En Windows, envía a un servidor SMTP. En ambos casos, el sysadmin configura el sistema de correo.

+2

Gracias por responder la pregunta que hice. No estaba seguro de si PHP estaba contactando al servidor remoto y manejando el SMTP, o si le pasó esa tarea al MTA en el servidor local. Además, ¿sabes por qué esta pregunta está siendo downvoted? Creo que mucha gente simplemente lo malinterpretó. Parece encajar en el alcance del sitio (como se define en [Preguntas frecuentes] (http://stackoverflow.com/faq)). –

+5

@Tom: La gente se obsesiona con la redacción en lugar de la pregunta. –

+0

He modificado la pregunta para ayudar a rectificar el problema. No entiendo qué es "ambiguo, vago, incompleto, demasiado amplio o retórico" al respecto. Intenté preguntar en la sala de chat de PHP, pero no había moderadores allí o ninguno respondió. ¿Hay un mejor lugar para aprender sobre el sitio? –

4

Realmente no es tan confiable, a menos que el sendmail subyacente o algo esté configurado correctamente.

Amazon SES tiene mejores servidores que cualquier servidor que esté utilizando y recibe correo allí más veces que con mail().

La razón real por la que no debe usar mail() es porque la dirección IP de su servidor es probablemente completamente desconocida para servicios de correo como GMail, Yahoo, etc., y hay una mayor probabilidad de que se marque como spam. ¿Por qué se marca como spam? Porque mail() es muy fácil y simple de explotar con fines no deseados.

+2

Esto realmente no responde la pregunta, que fue cómo funciona. Yo uso SES para otras cosas. Esto simplemente quería saber cómo funciona en una instalación limpia sin configuración, no por qué se marca como spam o qué debo usar en su lugar. Gracias por la respuesta, sin embargo. –

+0

sendmail. /conversacion. – David

4

mail() usa sendmail, que usa DNS para encontrar el registro MX del dominio de destino y lo entrega allí directamente. Eso es.

y dado que el servidor de destino probablemente no conozca su dirección IP, especialmente si está NATed, puede marcarse como correo no deseado.

puede modificar su configuración para usar un servidor smtp diferente (conocido legalmente) para actuar como intermediario.

7

Puede detectar cómo funciona de la siguiente manera.

Primer método

$ ltrace php -r "mail('[email protected]', 'Test', 'Hello world');" 2>&1 | grep sendmail 
memcpy(0x095ea168, "sendmail_from", 14)   = 0x095ea168 
memcpy(0x095ea1e0, "sendmail_path", 14)   = 0x095ea1e0 
popen("/usr/sbin/sendmail -t -i ", "w")   = 0x0977c7c0 

A partir de los resultados del comando anterior se puede ver que la función popen() se abre el proceso de /usr/sbin/sendmail -t -i.

$ ls -l /usr/sbin/sendmail 
... /usr/sbin/sendmail -> exim4 

Así sendmail es el enlace simbólico a exim4 y por lo tanto sendmail -t -i invoca exim4 -t -i.

Y en la página del manual de exim4 se puede leer acerca de estas opciones -t -i:

$ man exim4 | grep ' -t -i' 
-ti  This option is exactly equivalent to -t -i. It is provided for compatibility with Sendmail. 

Segundo método

Instalar snoopy y ejecute:

# grep snoopy /var/log/auth.log | tail 
... php -r mail('[email protected]', 'Test', 'Hello world'); 
... /usr/sbin/sendmail -t -i 
... /usr/sbin/exim4 -Mc 1YxxYn-0006a7-Nw 
... /usr/sbin/exim4 -t -oem -oi -f <> -E1YxxYn-0006a7-Nw 
... /usr/sbin/exim4 -Mc 1YxxYn-0006aB-Oj 

Los resultados del comando anterior muestra la secuencia de los comandos que se realizaron.