Журналируем вызовы функции mail() в php (100% рабочий вариант!)

Ты администратор виртуального хостинга? Тебя задолбали скриптовые спам-машины? Часто приходят абузы? ОК! Меня это всё доставало не меньше. Я перерыл море форумов и перечитал кучу разных советов. В итоге пришёл к тому, что ни один из найденных мной вариантов не работает у меня. Ну как говорят, если хочешь что то сделать хорошо – делай это сам. Как я, собственно и поступил.
Берём себя в руки, и начинаем действовать. :)

Патчить будем вручную, т.к. а) мне было лень делать патч; б) так мы меньше зависим от версий… От 5.2.17 до 5.3.3 всё точно работает. Проверял лично.

Теперь сама суть:
Распаковываем исходники php. Переходим в директорию ./php-5.x.x/ext/standard и ищем там файл mail.c.
Открываем его в каком-нибудь удобном редакторе. Находим строку

#include "exec.h"

и вставляем после неё

#include "main/php_syslog.h"
#include "zend_execute.h"

Затем находим строки, похожие на

/* {{{ php_mail
*/
PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char *extra_cmd TSRMLS_DC)
{
#if (defined PHP_WIN32 || defined NETWARE)
int tsm_err;
char *tsm_errmsg = NULL;
#endif
FILE *sendmail;
int ret;
char *sendmail_path = INI_STR("sendmail_path");
char *sendmail_cmd = NULL;
char *mail_log = INI_STR("mail.log");
char *hdr = headers;
#if PHP_SIGCHILD
void (*sig_handler)() = NULL;
#endif 

И вставляем после них

/* php_mail logging */
php_syslog(LOG_NOTICE | LOG_LOCAL0, "%s sending mail to <%s> [%s]\n" , (char*)zend_get_executed_filename(TSRMLS_C), to, subject);
/* end */

А теперь сохраняем, и собираем php.
После установки необходимо настроить вывод логов. Если внимательно взглянуть на код, становится ясно, что логи обрабатываются с помощью syslog. После установки, логи автоматически начнут сыпаться в messages, но нас такой вариант не устраивает, по этому, открываем конфиг /etc/rsyslog.conf и добавляем строку

local0.* /var/log/php_mail.log

Сохраняем, и перезагружаем rsyslog

service rsyslog restart

Запускаем тестовый скрпит

<?php
mail(‘[email protected]’,’test’,’test’)
?>

Смотрим в /var/log/php_mail.log и радуемся жизни! :)

Ах да… Если хотите меня отблагодарить, за столь полезную штуку, можете отправить мне столько, сколько не жалко на мой кошелёк Z376335536674 или R220694861060 :)