How to get statistics on message count and size for virtual aliases?

2011-05-28 Thread Evan Martin
I'd like to keep statistics on the number and total size of messages 
received for each virtual domain each day. Similar idea to quotas, 
except I want to keep the stats even for virtual aliases (forwarded to 
external addresses), not just mailboxes. Ideally I'd like to insert a 
record for each message into a PostgreSQL DB, which I could then query 
for any period of time I want.


Could anyone suggest the best approach to this? I've read the FILTER 
README and I think filters can be used to do this, but is there a 
simpler, faster way? I don't need to actually filter messages, I only 
want to be notified about each message and I would need to know its size 
and recipient (the real RCPT TO recipient, not the one in the To/Cc 
headers). Or is there already something that does this?


I'm running Postfix 2.8.3. Thanks in advance for any help.

Evan


Re: How to get statistics on message count and size for virtual aliases?

2011-05-28 Thread mouss
Le 28/05/2011 16:02, Evan Martin a écrit :
 I'd like to keep statistics on the number and total size of messages
 received for each virtual domain each day. Similar idea to quotas,
 except I want to keep the stats even for virtual aliases (forwarded to
 external addresses), not just mailboxes. Ideally I'd like to insert a
 record for each message into a PostgreSQL DB, which I could then query
 for any period of time I want.
 
 Could anyone suggest the best approach to this? I've read the FILTER
 README and I think filters can be used to do this, but is there a
 simpler, faster way? I don't need to actually filter messages, I only
 want to be notified about each message and I would need to know its size
 and recipient (the real RCPT TO recipient, not the one in the To/Cc
 headers). Or is there already something that does this?
 

you can parse postfix logs.

assuming you have a single instance of postfix (thus you have one qmgr):

*) for /qmgr log lines, store the queueid and the size to your database.
so you'd have a table qmgrlog with
- id
- time stamp
- queueid
- size
- optional: from
- optional: status (default to 0, then to set to 1 if you see removed
in a /qmgr log line)

*) for /smtp, /lmtp and /pipe log lines (be sure to exclude smtpd when
matching smtp), store the queueid as well as all field=value parts
that you need. so you'd have a table say deliverylog with
- id
- time stamp
- logger (typically postfix/smtp and so on. note that the postfix
part mpay be changed using syslog_name)
- queueid
- to
- orig_to
- relay
- status
- optional: delay
- optional dsn
- optional: the trailing text such as (250 2.0.0 from )

the relay= will help you if you have a content filter. note that you can
also play with syslog_name to make it easier to detect before and after
filter deliveries.


you can either
-  have a tail -F like script that parses logs continuously, (if your
system doesn't support the '-F' flag, you'll need to use '-f' but you
then need to detect log file rotation).

- or have a script that runs periodically. then you need to keep info on
where you stopped before. in many prog languages [for example: perl],
you can use a seek function...