Информация
На главную Главная

Мой t-cards.ru
Войти Войти
Зарегистрироваться Регистрация

Разное
Форум Форум
Вернуться Форумы на t-cards.ru> Hard"n"Soft
Логин
Пароль
Регистрация Участники Поиск >> FAQ


Сообщения в теме: "Exim - учет почтового трафика..."
17.07.2006 00:29
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 284
По умолчаниюExim - учет почтового трафика

Задумал посчитать, сколько же трафика по мылу ходит, собрать статистику так сказать...
Идея такова, чтоб при локальной доставке письма оно оставляло след в табличке в базе данных, с какого ip, от кого, кому, размер письма.
Примерная, конечно, статистика (есть ведь еще отброшенные письма, есть письма, которые по редиректу уходят), но все же.
Создал в базе табличку

CREATE TABLE `stat` (
`id` int(11) NOT NULL auto_increment,
`ip` varchar(20) default NULL,
`mail_from` varchar(255) default NULL,
`h_from` varchar(255) default NULL,
`rcpt_to` varchar(255) default NULL,
`h_to` varchar(255) default NULL,
`spam_score_int` int(11) default NULL,
`bytes` bigint(20) NOT NULL default "0",
`local` tinyint(4) NOT NULL default "0",
`curr_date` datetime default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
UNIQUE KEY `IX_stat` (`id`,`local`),
KEY `IX_stat_1` (`rcpt_to`)
) TYPE=MyISAM


Вставил в перловый скрипт (exim.pl, который уже мучали все кому не лень в предыдущих статьях функцию для вставки строки (скрипт привожу ниже), поменял папку локальной доставки (сделал так, чтоб функция insert_stat отрабатывала, возвращая пустую строку):
address_delivery:
          directory = ... /${perl {insert_stat}{$acl_c4}{$acl_c5}{$local_part@$domain}{$acl_c0}{$acl_c1}{$acl_c3}{$acl_c9}}


А переменные $acl_cх необходимо проинициализировать в acl, т.к. в блоке локальной доставки не все доступно, а глобальные переменные - пожалуйста!
acl_check_message:

warn message =
set acl_c0 = ${perl{header_decode}{$rheader_from:}}
set acl_c1 = ${perl{header_decode}{$rheader_to:}}
set acl_c2 = ${perl{header_decode}{$rheader_subject:}}
set acl_c3 = $spam_score_int
set acl_c4 = $sender_host_address
set acl_c5 = $sender_address
set acl_c9 = $message_size

... и чтоб балл спама проинициализировать корректно, добавил строку в блок проверки на спам

warn message = X-Spam-Score: $spam_score ($spam_bar)
spam = nobody:true
set acl_c3 = $spam_score_int

Теперь имеем в таблице stat кучу записей, которые можно потом обрабовать как душе угодно!
17.07.2006 00:29
Admin

Регистрация: 05.10.2005
Проживание: Москва
Сообщения: 284
По умолчаниюExim - учет почтового трафика

Скрипт:

#!/usr/bin/perl -w
use DBI;
use DBD::mysql;
use MIME::Words qw(:all);
use Text::Iconv;


use MIME::Words qw(:all);
use Text::Iconv;

sub header_decode {
my ($header) = @_;
my $h = join("", map {xcode(${$_}[1], ${$_}[0])} decode_mimewords($header));
if ($h =~/.*\<(.*)\>.*/) {
return $1;
}
return $h;
}

sub xcode {
my ($charset, $str) = @_;
return $str unless $charset;
my $conv = Text::Iconv->new($charset, "CP1251");
#my $conv = Text::Iconv->new($charset, "KOI8-R");
return $conv->convert($str);
}

sub insert_stat{
my ($ip,$mail_from,$rcpt_to,$h_from,$h_to,$spam_score_int,$bytes) = @_;
my $local = "0";
if ($ip =~/^192\.168\..*/){
$local = 1;
}
$h_from = header_decode($h_from);
$h_to = header_decode($h_to);
my $con;
$con = DBI->connect("DBI:mysqlatabase=mail;host=localhost","mail","");
$con->do("INSERT stat (ip,mail_from,rcpt_to,h_from,h_to,spam_score_int,bytes,local,curr_date) SELECT "$ip","$mail_from","$rcpt_to","$h_from","$h_to","$spam_score_int",$bytes, $local, now()");
return "";
}