Esta es una configuración que puede ser muy útil para detectar el envío de spam a través de nuestro servidor Web mediante scripts PHP. PHP permite registrar un evento en un log cada vez que un script PHP envía un correo electrónico utilizando la función mail().

La función mail() de PHP envía un mail directamente desde PHP, sin utilizar un cliente de correo externo ni un relay host. Esta función se conecta directamente al puerto 25 (SMTP) del servidor de correo destino (de acuerdo al remitente) y envía el mensaje pasado como parámetro. Es un envío de correo directo pues no se utiliza un relay host, agente de envío de correo o MTA.

Esta función es limitada en el sentido que no soporta SSL/TLS, pero tiene la ventaja de no necesitar un agente de envío de correo en el servidor origen del mensaje. Por esta última razón es frecuentemente utilizada maliciosamente para el envío de spam.

Afortunadamente, PHP cuenta con una opción de configuración (mail.log) que permite registrar el uso de esta función. Esta configuración se aplica directamente en el archivo php.ini, con lo cual es independiente del servidor Web utilizado. Este artículo se basa en un servidor Web Nginx con PHP-FPM, pero la configuración es idéntica para cualquier otro servidor.

Editar el archivo de configuración de PHP-FPM:

# nano /etc/php5/fpm/php.ini

Configurar las variables mail.add_x_header y mail.log:

; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
mail.add_x_header = On

; The path to a log file that will log all mail() calls. Log entries include
; the full path of the script, line number, To address and headers.
mail.log = /var/log/phpmail.log

La configuración mail.add_x_header agrega información acerca del script que realiza la llamada a la función mail(). mail.log indica la ruta al archivo donde registrar dichas llamadas.

En caso de utilizar Apache con PHP como módulo, es posible correr phpinfo() para saber con exactitud qué archivo de configuración (php.ini) se está utilizando.

Crear el archivo de log y otorgar permisos para el usuario con el que corre FPM:

# touch /var/log/phpmail.log
# chown www-data:www-data /var/log/phpmail.log

Recargar la configuración de FPM:

# service php5-fpm restart

Crear un script PHP que envíe un mail:

# nano /var/www/enviar_mail.php 
<?php

mail("sysadmin@linuxito.com","Prueba","Mail de prueba de logueo de mensajes");

Cargar el script enviar_mail.php desde un browser monitoreando el archivo de log en tiempo real:

# tail -f /var/log/phpmail.log 
mail() on [/var/www/enviar_mail.php:3]: To: sysadmin@linuxito.com -- Headers: 

Se observa que el evento ha quedado registrado correctamente.

Referencias

PHP Runtime Configuration - mail.log

PHP - mail


Tal vez pueda interesarte


Compartí este artículo