#!/usr/bin/env ruby
# Converts a postfix log file into awstats mailserver log 
# Author: Michael Kessler
#         Markus Schlichting (changes for mailsize & from/to)
# No rights reserved 
require 'date' 
senders = Hash.new 
mailservers = Hash.new 
mailsize = Hash.new
year = Time.now.strftime(" %Y") 
for line in STDIN.read.split("\n") do 

#rejected messages with full qualified hostname of mailserver 
if line =~ /^(\w\w\w [\d\s]\d) (\d\d:\d\d:\d\d).*NOQUEUE.*RCPT from ((?:[-a-z0-9]+\.)+[a-z]{2,})\[.*\]: (\d\d\d).*from=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})> to=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})>/ 
puts "#{Date.parse($1 + year).strftime('%Y-%m-%d')} #{$2} #{$5} #{$6} #{$3} - SMTP - #{$4} ?" 

#rejected messages with only ip address of mailserver 
elsif line =~ /^(\w\w\w [\d\s]\d) (\d\d:\d\d:\d\d).*NOQUEUE.*RCPT from unknown\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?\]: (\d\d\d).*from=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})> to=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})>/ 
puts "#{Date.parse($1 + year).strftime('%Y-%m-%d')} #{$2} #{$5} #{$6} #{$3} - SMTP - #{$4} ?" 

#amavis passed email, get sender for accepted messages 
elsif line =~ /^.*amavis.* Passed.*<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})> -> <.* queued_as: (\w+),/ 
senders.store($2,$1) 

#connected mailserver with full qualified hostname 
elsif line =~ /^.*postfix\/smtpd\[\d+\]: (\w+): client=((?:[-a-z0-9]+\.)+[a-z]{2,})\[.*\]/ 
mailservers.store($1,$2) 

#connected mailserver with only ip address 
elsif line =~ /^.*postfix\/smtpd\[\d+\]: (\w+): client=unknown\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?\]/ 
mailservers.store($1,$2) 

#get mailsize as well as from email
elsif line =~ /^.*postfix\/qmgr\[\d+\]: (\w{11}): from=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})>, size=(\d+)/
senders.store($1,$2)
mailsize.store($1,$3)

#accepted messages 
elsif line =~ /^(\w\w\w [\d\s]\d) (\d\d:\d\d:\d\d).* (\w+): to=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})>.* queued as (\w+)/ 
puts "#{Date.parse($1 + year).strftime('%Y-%m-%d')} #{$2} #{senders.fetch($5,'unknown')} #{$4} #{mailservers.fetch($3,'unknown')} - SMTP - 250 #{mailsize.fetch($5,'?')}"
end 
end 

