Hi all,

I'd like to calculate mail traffic on a per domain base. Calculation should include mail sent and mail received. I've been thinking of using the message id as some sort of "key" for everything since it's supposed to be unique, right ?

I've been searching for a ready made solution and haven't come accross something, so I started working on a solution.


My current ideas: - calculate traffic for each day (via cronjob) with traffic in/out per domain - domains which this calculation should be done for are listed in accounting_domains

I've built a small example program (attached as example.pl) an example log file is also attached.


My knowledge of Perl is not quite well so I'm looking for help to archive the goal of doing this calculation. Anybody out there for help ? :-)




Kind Regards,

Markus Welsch
Mar 17 07:11:43 box postfix/pickup[489]: 2C2C7C0A8: uid=1000 from=<markus>
Mar 17 07:11:43 box postfix/cleanup[493]: 2C2C7C0A8: message-id=<[EMAIL 
PROTECTED]>
Mar 17 07:11:43 box postfix/qmgr[451]: 2C2C7C0A8: from=<[EMAIL PROTECTED]>, 
size=435, nrcpt=7 (queue active)
Mar 17 07:11:44 box postfix/smtp[495]: 2C2C7C0A8: to=<[EMAIL PROTECTED]>, 
relay=XXX.XXX.net[XXX.XXX.XXX.XXX], delay=1, status=sent (250 2.0.0 
h2H72LG00567 Message accepted for delivery)
Mar 17 07:11:44 box postfix/smtp[495]: 2C2C7C0A8: to=<[EMAIL PROTECTED]>, 
relay=XXX.XXX.net[XXX.XXX.XXX.XXX], delay=1, status=sent (250 2.0.0 
h2H72LG00567 Message accepted for delivery)
Mar 17 07:11:44 box postfix/smtp[494]: 2C2C7C0A8: to=<[EMAIL PROTECTED]>, 
relay=XXX.XXX.net[XXX.XXX.XXX.XXX], delay=1, status=sent (250 2.0.0 
h2H72LG00566 Message accepted for delivery)
Mar 17 07:11:44 box postfix/smtp[494]: 2C2C7C0A8: to=<[EMAIL PROTECTED]>, 
relay=XXX.XXX.net[XXX.XXX.XXX.XXX], delay=1, status=sent (250 2.0.0 
h2H72LG00566 Message accepted for delivery)
Mar 17 07:11:44 box postfix/smtp[494]: 2C2C7C0A8: to=<[EMAIL PROTECTED]>, 
relay=XXX.XXX.net[XXX.XXX.XXX.XXX], delay=1, status=sent (250 2.0.0 
h2H72LG00566 Message accepted for delivery)
Mar 17 07:11:44 box postfix/smtp[494]: 2C2C7C0A8: to=<[EMAIL PROTECTED]>, 
relay=XXX.XXX.net[XXX.XXX.XXX.XXX], delay=1, status=sent (250 2.0.0 
h2H72LG00566 Message accepted for delivery)
Mar 17 07:11:44 box postfix/smtp[494]: 2C2C7C0A8: to=<[EMAIL PROTECTED]>, 
relay=XXX.XXX.net[XXX.XXX.XXX.XXX], delay=1, status=sent (250 2.0.0 
h2H72LG00566 Message accepted for delivery)
#!/usr/bin/perl -w
use strict;

# Mar  5 13:47:15 box postfix/smtpd[873]: 8859A1FFB0: 
client=ns.suk.net[195.126.239.3]
# Mar  5 13:47:15 box postfix/qmgr[741]: 8859A1FFB0: from=<[EMAIL PROTECTED]>, 
size=1987, nrcpt=1 (queue
# active)
# Mar  5 13:47:16 box postfix/virtual[879]: 8859A1FFB0: to=<[EMAIL PROTECTED]>, 
relay=virtual, delay=1, status=sent
# (maildir)

my $client_ip;
my $mail_from;
my $mail_to;
my $message_id;
my $message_size;
my $message_time;
my $nr_recipient;

my %messages;


open(FILE, "mail.log") or die "Couldn't open mail.log: $!; aborting";
while (<FILE>) {
        if ($_ =~ /(\S+ .* \d+:\d+:\d+) .* postfix\/smtpd\[.*\]: (\S+): 
client=.*\[(\d+\.\d+\.\d+\.\d+)\]$/) {
                $message_time = $1;
                $message_id = $2;
                $client_ip = $3;

                print "Message-ID: \t", $message_id,"\n";
                print "Message-Time: \t", $message_time,"\n";
                print "Client-IP: \t", $client_ip,"\n\n";
        } elsif ($_ =~ /.* postfix\/qmgr\[.*\]: (\S+): from=<(\S+)>, 
size=(\d+), nrcpt=(\d+)/) {
                $message_id = $1;
                $mail_from = $2;
                $message_size = $3;
                $nr_recipient = $4;

                print "Message-ID: \t",         $message_id,    "\n";
                print "Mail from: \t",          $mail_from,     "\n";
                print "Messagesize: \t",        $message_size,  "\n";
                print "No recipients:\t",       $nr_recipient,  "\n\n";
        } elsif ($_ =~ /.* postfix\/.*: (\S+): to=<(\S+)>/) {
                $message_id = $1;
                $mail_to = $2;

                print "Message-ID: \t",         $message_id,    "\n";
                print "Mail to: \t",            $mail_to,       "\n\n";
        }
}
close(FILE);

Reply via email to