php mail () funciona muy lento en la máquina de desarrollo local


21

Antecedentes: si ha configurado un servidor apache local para fines de desarrollo, es posible que se haya encontrado con el problema de que sendmail tarda mucho (al menos un minuto) en enviar correos electrónicos. Esto es extremadamente frustrante si está intentando depurar un problema con un correo electrónico que ha generado.

Hay varias publicaciones en el foro en Internet que analizan este problema. Sin embargo, ninguno de los temas describe qué hacer con suficiente detalle para mi conocimiento limitado. Estos son los pasos que me funcionaron:

1) encuentre su nombre de host (en caso de que lo haya olvidado) usando este comando:

:~$ cat /hosts/hostname

myhostname

2) edite el archivo /etc/hostsy asegúrese de que la primera línea sea la siguiente:

127.0.0.1 localhost.localdomain localhost myhostname

3) edite el archivo de configuración de sendmail ( /etc/mail/sendmail.cfen Ubuntu) y descomente la línea#O HostsFile=/etc/hosts

4) Reinicie la computadora. La computadora debería iniciarse mucho más rápido ahora y la función mail () debería regresar casi de inmediato. SIN EMBARGO, los correos electrónicos no se enviarán a menos que siga el paso 5.

5) Debe usar la opción sendmail '-f' siempre que use la función de correo. Por ejemplo:

mail('recipient@somewhere.com', 'the subject', 'the message', null, '-fsender@somewhere.com');

Mi pregunta para mis compañeros servidoresfaulters es:

¿Qué cambios adicionales se pueden hacer para que no tenga que usar la opción sendmail -f? Aunque no es muy difícil agregar la opción -f, es un problema cuando su CMS (como Drupal) no usa la opción -f al enviar correo. Necesitaría hackear un módulo central para agregar esta opción.


1
en mi sistema Ubuntu el comando escat /etc/hostname
zkent

Respuestas:


6

Bueno, sé que esto no es lo que estás preguntando, pero ¿por qué no pruebas Postfix o Exim? Ambos están disponibles para ubuntu (Postfix es incluso el mta predeterminado en los sistemas Ubuntu) y ambos proporcionan un comando compatible 'sendmail' que funciona muy bien. En mi humilde opinión, sendmail está un poco anticuado y tendrás mejores oportunidades de soporte con MTA más moderno.


Incluso si hay mejores sistemas de correo que sendmail, el problema es mantener un servidor de desarrollo que refleje el servidor de producción. sendmail es el agente de correo predeterminado para php.
Michael B

1
¿Te refieres a sendmail el software o sendmail el binario? Porque Exim y Postfix también tienen el sendmailbinario que acepta las mismas opciones que el sendmail original, por cuestiones de compatibilidad.
coredump

No soy muy fanático de Exim por experiencia pasada, ¡pero probé con Postfix y resolví los problemas que teníamos con Sendmail de inmediato!
quickshiftin

2

Esto funcionó para mí:

  • Instalar postfix

Vea las instrucciones aquí sobre cómo hacer esto aquí: https://help.ubuntu.com/community/Postfix (Puede que ya esté instalado, y el binario 'sendmail' en realidad puede ser un alias para postfix)

  • Siga las instrucciones aquí:

http://lenss.nl/2009/01/making-php-mail-work-on-ubuntu-through-postfix/

mkfifo /var/spool/postfix/public/pickup

Encuentra el sendmailproceso

ps aux | grep mail

Mátalo

kill <thepid>

Reiniciar postfix

/etc/init.d/postfix restart

Creo que puede establecer el parámetro 'myorigin' en cualquier nombre de dominio activo, como el nombre de dominio que posee.


¡Perfecto! Hice esto DESPUÉS de acosarme durante dos horas. =)
Hannes Schneidermayer

1

Esto puede o no ser una solución para usted: agregue mail.force_extra_parameters = "-fsender@somewhere.com"a su archivo php.ini . Hace que PHP agregue automáticamente -fsender@somewhere.com como un quinto parámetro a la función mail () de PHP.

Ese es un valor codificado y solo aplicable en php.ini, por lo que no será muy flexible, pero ¿tal vez funcione para usted en su caso de desarrollo?


0

Al observar el tráfico de la red (pensar tcpdump) o al ejecutar un proceso straceen su sendmail o procesos de apache, debería poder hacerse una idea de por qué existe ese retraso para que pueda solucionar el problema raíz.

Por lo general, los retrasos en ese rango se deben a fallas en las búsquedas de DNS, pero no lo sabrá hasta que lo vea. A menos que solucione el problema subyacente, probablemente terminará siendo un problema sin importar cómo intente solucionarlo.


1
El retraso fue causado por el nombre de host como una sola palabra en lugar de un FQDN (nombre de dominio completo). Al señalar sendmail a / etc / hosts y tener localhost.domain como primer nombre de dominio (que es un FQDN) no hay demora. Esto se solucionó en los pasos 1-4. El problema restante es tener que usar '-f', que sigue siendo una mejora importante al tener que esperar 2 minutos para enviar el correo.
Michael B

0

Nunca me he encontrado con un problema al usar mail () en PHP que no fue resultado de un problema en el MTA.

En su archivo php.ini mostrará qué comando ejecuta para enviar un correo electrónico (predeterminado: "sendmail -t -i"). Intenta enviar un correo electrónico desde la línea de comando usando esto: apuesto a que es lento.

Lo habitual para verificar es si un servidor DNS está configurado correctamente en la máquina (y puede resolver todas las direcciones configuradas en el MTA) y que si se configura un relé inteligente, el nombre se puede resolver en una dirección a la que el sistema puede conectarse.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.