Solución a problema xmail + php5 + función mail()

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 [email protected] [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 [email protected] [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 [email protected] [email protected]
/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

  • Primero creamos un grupo nuevo llamado mail, con el comando addgroup mail
  • EN segundo lugar agregaremos a nuestro usuario (el que esta tratando de enviar un mail) al grupo mail, con el comando adduser usuario mail
  • Editaremos los permisos y grupo del directorio xmail en forma recursiva:

    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 [email protected] [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.

    Ingeniero, enfocado en la familia y el cliente, emprendiendo y capitalizando lo aprendido por años.

    2 Comments

    1. tOM

      Hi, this is amazing! I spent hours trying to force my php to work with xmail. Now it works. Thank you very much.

    Leave Comment

    Your email address will not be published. Required fields are marked *

    %d bloggers like this: