Apache en combinacion con php usan la funcion mail() para enviar correos haciendo uso de sendmail, pero ¿que pasa si no queremos usar sendmail, sino un MTA distinto como lo puede ser XMAIL ?
Hace tiempo que usaba sendmail en los servidores web ya que me habia resultado imposible hacer funcionar xmail en conjunto con php y su función e envio de correos, no sabia que pasaba, y hoy me propuse a solucionar el asuntillo 😀 .
Analizando el problema
Al tener sendmail instalado, apache y php envian perfecto, pero al usar algo distinto, como lo es xmail, simplemente no hacia nada. Los usuarios windows optan por habiitar la opcion de envio mediante SMTP, pero aun asi, en linux no funcionaba 😕
Instalando Xmail y testeando su reemplazo de Sendmail
Al instalar xmail, este crea un enlace simbólico a un binario que hace la misma tarea de sendmail, llamado xsendmail.
Vamos a testear si envia desde la consola de comandos.
Ingresamos como root y ejecutamos
#touch mensaje.txt
#sendmail -forigen@localhost [email protected] < mensaje.txt
Con este comando sendmail, o su reemplazo, deberia enviar un mail a [email protected], el cual tiene como contenido todo lo que esté escrito en mensaje.txt, archivo que hemos creado al momento de ejecutar “touch”.
Si estamos seguros que no llega nada, el problema es de conectividad o puertos cerrados, para verificar que xmail este trabajando podemos ejecutar netstat -tlpn
, con esto veremos si está efectivamente escuchando en el puerto 25, como debe ser.
Enviando mail con un usuario normal
Una vez de que llegue en forma correcta el mail al hacerlo como root, haremos algo parecido como usuario normal.
$ /usr/sbin/sendmail -forigen@localhost [email protected] < mensaje.txt
Aqui nos damos cuenta de algo extraño, no podemos escribir en la carpeta temp de xmail 😕
Cada vez que xmail envia un correo, lo va registrando y va haciendo cambios en el directorio temp
por lo que recibiremos de vuelta un mensaje como este:
/usr/sbin/sendmail -frodrigo@heracles rzamoran@gmail
/var/lib/xmail/spool/temp/1155444973000.19361.Heracles: Permission denied
He aqui la causa del problema!
Solo root puede enviar correos con xmail, pero un usuario normal no lo puede hacer por no contar con los permisos para escribir en algunos directorios de trabajo de xmail.
Solucionando el problema
addgroup mail
adduser usuario mail
chgrp -R mail /var/lib/xmail
chmod 775 -R /var/lib/xmail
Testeando resultados
Si tratamos de enviar un mail ahora como usuario normal, este deberia llegar sin problemas
$ /usr/sbin/sendmail -forigen@localhost [email protected] < mensaje.txt
Si es asi, ya estamos casi listos 😀
Selucionando problema de envio de mail() en php5
Como nos hemos dado cuenta, lo que hicimos anteriormente es cambiar ciertos permisos y crear un grupo llamado mail, el cual tendra acceso a escribir y enviar mails sin necesariamente ser root. Apache, en conjunto con php son capaces de enviar correos usando la famosa funcion mail(), pero como apache usa un usuario de trabajo llamado www-data para hacer todas sus labores como servidor web, este usuario tampoco tendrá permisos para escribir en el directorio de trabajo de xmail. Esta es la razón por que los formularios mail hechos en php no funcionaban al usar xmail y su reemplazo de sendmail llamado xsendmail. PAra solucionar esto, simplemente agregamos a www-data al grupo mail.
adduser www-data mail
Verificando la ruta de sendmail en php.ini
Seguramente será necesario editar el fichero php.ini que corresponda a la version de php usada, en el caso mio, uso debian y sería:
/etc/php5/apache2/php.ini
Dentro de este fichero hay una seción comentada que dice:
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path =
Esta debe quedar de la siguiente forma:
sendmail_path = /usr/sbin/sendmail -t -i
Finalmente reiniciamos apache para que sus modulos se carguen nuevamente con las configuraciones que hemos hecho.
Resumen
Finalmente xmail trabaja con php, no era prblema de funcionamiento, sino de permisos, cosa que no era facil de detectar sin hacer las pruebas correspondientes. Xmail es un servidor de correos bastante potente a mi gusto y cumple en forma bastante eficiente las tareas de enviar y recibir correos ya sea en forma local o remota, para que mensionar su rapidez, ya que en comparacion de sendmail, xmail es bastante mas rápido y facil de configurar.
Excelent ! 😀
Hi, this is amazing! I spent hours trying to force my php to work with xmail. Now it works. Thank you very much.