Tag-Archiv für 'postfix'

31
Dez

Postfix Logdateien mit AWStats auswerten

Um die Logdateien von Postfix auszuwerten und auch noch grafisch schön aufzubereiten eignet sich AWStats hervorragend. AWStats bringt auch mit maillogconvert.pl ein Perlscript für die Konvertierung von Maillogs von diversen Mailserrvern mit um die Mailserver Logfiles auswerten zu können. Unter Ubuntu in Kombination mit Avamis klappt nun nach der Umstellung zur aktuellsten Version Edgy Eft die Auswertung nicht mehr richtig: Das Perlscript findet nur noch alle fehlgeschlagenen Emails, jedoch keine welche erfolgreich versendet wurden (SMTP Status 250). Da das Script durch die Unterstützung diverser Mailserver ziemlich gross ist und ich auch kein Perl-Fan, habe ich mir selber ein kleines Script für die Konvertierung in Ruby geschrieben:

#!/usr/bin/env ruby
# Converts a postfix log file into awstats mailserver log
# Author: Michael Kessler
# No rights reserved
require 'date'
senders = Hash.new
mailservers = 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)
 
  #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 ?”
  end
end

Das Problem mit den gesendeten Emails ist, dass die benötigten Informationen nicht auf einer Logzeile zu finden sind. Desshalb müssen diese Vorgängig geparst werden und anhand der Message-ID beim Senden angereichert werden. Dies kann bei einer täglichen Rotation der Logdateien auch dazu führen, dass nicht alle Informationen in der gleichen Logdatei zu finden ist.

Das Script sieht auf den ersten Blick nicht wirklich lesbarer als ein Perl Script aus, was jedoch an den langen regulären Ausdrücken liegt und nicht an Ruby. Das Script wird übrigens genau gleich wie maillogconvert.pl in die AWStats Konfiguration eingebunden.

28
Sep

Mailman für Postfix/MySQL unter Ubuntu

Ich habe bei mir bereits Postfix im Einsatz, der die virtuellen Domänen und Benutzer von einer MySQL Datenbank holt. Nun habe ich noch Mailmain aufgesetzt, da die Forwards von Postfix für einen Verteiler kein Ersatz ist für eine richtige Mailingliste sind.

Als erstes also Mailman mit dem Pakertmanager von Ubuntu installieren:

apt-get install mailman

und gleich die Berechtigungen mit dem Tool das von Mailman mitgeliefert wird überprüft:

check_perms

Nun sollte man theoretisch einfach die Option -f Anhängen um die Probleme automatisch beheben zu lassen:

check_perms -f

was aber nicht wirklich klappt (nochmals mit check_perms überprüfen). Man muss also die Berechtigungen selber korrigieren:

cd /var/lib/mailman
chown -R list:list *

Auch muss die Masterkonfiguration von Postfix noch angepasst werden, damit Mailman läuft:

vim /etc/postfix/master.cf

Die Konfiguration öffnen und nach folgender Zeile suchen:

mailman unix - - n - - pipe

… und diese dann folgendermasen anpassen:

mailman unix - n n - - pipe

Als nächstes muss man noch den Apache konfigurieren für das Webinterface von Mailman. Ich habe bei mir nur eine virtuelle Domäne angepasst und nicht gleich eine Modulkonfiguration für alle Domänen vorgenommen. Also einfach die Konfiguration der gewünschten Domäne mit dem Editor öffnen und folgende Einträge hinzufügen:

#Mailman cgi Script für das Webinterface
ScriptAlias /mailman/ /usr/lib/cgi-bin/mailman/
ScriptAlias /cgi-bin/mailman/ /usr/lib/cgi-bin/mailman/
<Directory /usr/lib/cgi-bin/mailman/>
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>

#Öffentliches pipermail archiv
Alias /pipermail/ /var/lib/mailman/archives/public
<Directory /var/lib/mailman/archives/public>
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
</Directory>

#Bilder für Mailman
Alias /images/mailman/ /usr/share/images/mailman/
<Directory /usr/share/images/mailman/>
AllowOverride None
Order allow,deny
Allow from all
</Directory>

Die Liste wollte ich nicht unter der Standartdomäne netzpiraten.ch laufen lassen, sondern unter lists.netzpiraten.ch. Dazu habe ich dann einfach einen neuen DNS Eintrag gemacht. Man darf nicht vergessen für die Listdomäne nicht nur einen A Record sondern auch einen MX Record zu machen, ansonsten verweigern einige Mailserver die Annahme oder stufen die Emails von dieser Domäne schneller als Spam Mail ein.

Nun muss natürlich noch Mailman so konfiguriert werden, dass er auch Postfix typisch konfiguriert ist und auch die neue Listendomäne verwendet:

vim /etc/mailman/mm_cfg.py

Als erstes den Mailserver und den Webserver eingetragen:

DEFAULT_EMAIL_HOST = 'lists.netzpiraten.ch'
DEFAULT_URL_HOST   = 'www.netzpiraten.ch'

Dannach in der gleichen Datei Postfix konfigurieren und zusätzlich die Listdomäne angegeben:

MTA='Postfix'
POSTFIX_STYLE_VIRTUAL_DOMAINS = ['lists.netzpiraten.ch']
add_virtualhost('www.netzpiraten.ch', 'lists.netzpiraten.ch')

Nun muss mailman neu gestarted werden:

/etc/init.d/mailman restart

Als nächstes muss man die obligatorische mailman Mailingliste erstellen und gleich noch eine zweite zum Testen dazu:

newlist mailman
Enter the email of the person running the list: michi@netzpiraten.ch
Initial test password:
Hit enter to continue with test owner notification..
newlist test
Enter the email of the person running the list: michi@netzpiraten.ch
Initial test password:
Hit enter to continue with test owner notification..

Jetzt können die Aliases und Domains generiert werden. Dazu einfach das von Mailman mitgelieferte genaliasverwenden:

cd /var/lib/mailman/bin
./genaliases

Dannach sind die Dateien /var/lib/mailman/data/aliases und /var/lib/mailman/data/virtual-mailman generiert und enthalten alle benötigten Aliase für die Mailinglisten. Jetzt muss nur noch Postfix so konfigueriert werden, dass er diese Dateien auch verwendet:

vim /etc/postfix/main.cf

Zuerst die Aliase zu den normalen Systemaliasen hinzufügen:

alias_maps = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases

Die alias_database soll nicht eingetragen werden, da Mailman diese selber verwaltet und nicht postfix mit newalias. Als nächstes noch die virtuellen Domänen eintragen:

virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf,
                   proxy:mysql:/etc/postfix/mysql-virtual_email2email.cf,
                   hash:/var/lib/mailman/data/virtual-mailman

Bei mir ist ja bereits der MySQL Zugriff konfiguriert, desshalb habe ich einfach die Mailman-Einstellungen hinten angehängt.

Nun nur noch eine Einstellung ändern, damit auch die *-owner Aliase richtig behandelt werden und die Listdomäne auch als möglichen Empfänger angeben:

owner_request_special = no
relay_domains = lists.netzpiraten.ch
mydestinations = $hostname, localhost.$mydomain, lists.netzpiraten.ch

Jetzt Postfix neu laden:

/etc/init.d/postfix reload

und schon sind die Mailinglisten einsatzbereit. Man darf nicht vergessen, nach einem ./genaliases Postfix auch wieder neu zu laden.




September 2010
M D M D F S S
« Jun    
 12345
6789101112
13141516171819
20212223242526
27282930  

Werbung


Buttonitis