Monitorare i messaggi di posta spediti con la funzione mail() del php

Se  state gestendo un server web dove sono ospitati molti siti, prima o poi potrebbe essere necessario dover  far fronte a dello spam in uscita dalla vostra macchina; Messaggi generati da qualche form poco sicuro pubblicato in un sito, ma in quale? Non sempre negli header delle email si trovano informazioni utili ad individuarlo. Creando un wrapper del binario sendmail, risolveremo questo problema. Ecco come procedere:

Creiamo il nostro wrapper in /usr/local/bin/ chiamandolo sendmail-wrapper.php con il seguente codice al suo interno:

#!/usr/bin/php
<?php
$sendmail_path = '/usr/sbin/sendmail';
$file_di_log = '/tmp/mail_php-' . $_ENV['APACHE_RUN_USER'] . '.log';

$logline = '';
$pointer = fopen('php://stdin', 'r');

while ($line = fgets($pointer)) {
if(preg_match('/^to:/i', $line) || preg_match('/^from:/i', $line)) {
$logline .= trim($line).' ';
}
$mail .= $line;
}

$command = 'echo ' . escapeshellarg($mail) . ' | '.$sendmail_path.' -t -i ';
for ($i = 1; $i < $_SERVER['argc']; $i++) {
$command .= escapeshellarg($_SERVER['argv'][$i]).' ';
}

file_put_contents($file_di_log, date('Y-m-d H:i:s') . ' ' . $_ENV['PWD'] . '  ' . $logline . "\n", FILE_APPEND);

shell_exec($command);
?>

N.B. sendmail-wrapper.php deriva da uno script di Till Brehm. E' stato necessario apportare delle modifiche per sistemare alcuni bug e per renderlo compatibile con i nuovi sistemi.

Impostiamo su di esso i permessi di esecuzione

chmod 755 /usr/local/bin/sendmail-wrapper.php

Editiamo la configurazione del php.ini utilizzata dai siti (probabilmente /etc/php5/apache2/php.ini) decommentando (eliminando il carattere ; da inizio riga) la direttiva 'sendmail_path' ed associandogli come valore il percorso del nostro wrapper. In questo modo:

sendmail_path = /usr/local/bin/sendmail-wrapper.php

Dopo aver riavviato il web server potremo verificare che ogni qualvolta viene inviata un'email con il metodo mail del php, in un file di log presente nella directory /tmp sara' memorizzato il nome del sito che ha inviato il messaggio. Il nome del log avra' il seguente formato e sara' memorizzato nella directory /tmp:

mail_php-'UTENTE-CHE-ESEGUE-IL-PHP'.log

Se il php dei siti viene eseguito come modulo, allora il file sara' questo:

/tmp/mail_php-www-data.log

Mentre se i siti sono eseguiti con la suexec verra' generato piu' di un log. Ad esempio

/tmp/mail_php-sito1.log

/tmp/mail_php-sito2.log

/tmp/mail_php-sito3.log

Potrete tastare il tutto creando in un sito un file php con questo contenuto e richiamandolo via browser web

<?php
mail('indirizzo_destinatario@suo-sito.it','This is a test message subject','This is a test message body','','-ftuoindirizzo@tuo-sito.it');
echo 'Messaggio Inviato';
?>

N.B. Modificare l'indirizzo del mittente e del destinatario nella funziona mail