Fetchmail
Inhaltsverzeichnis |
Warum brauche ich Fetchmail?
Wenn man auf seinem Server einen eigenen Mail-Dienst laufen hat, entsteht schnell der Wunsch, seine ganzen Postächer z.b. GMX und Co. auf seinem eigenen Server automatisch zu sammeln.
Installation von Fetchmail
Unter Debian wie gewohnt einfach mit dem Befehl
apt-get install fetchmail
Wie wird ein Fetchmail eingerichtet
Auf das "normale" Einrichten von fetchmail möchte ich hier ersteinmal nicht eingehen, dazu gibt es mehr als genug Anleitungen; empfehlen kann ist die Fetchmail anleitung von Tuxhausen (http://www.tuxhausen.de/fetchmail.html). Ich habe, da ich auf meinem Server einen LDAP laufen habe, eine Erweiterung von Fetchmail für LDAP geschrieben, auf die ich nun näher eingehen möchte.
Fetchmail mit LDAP
Um Fetchmail mit LDAP nutzen zu können, muß ein LDAP-Server installiert werden und dieser muß dann noch um eine Schemata erweitert werden.
Installation von OpenLDAP
Die Installation von LDAP unter Debian Linux wie gewohnt einfach mit folgendem Befehl:
apt-get install slapd
Installation des neuen Schemas
Nun muss im Verzeichnis /etc/ldap/schema/ eine Datei mit dem Namen fetchmail.schema angelegt werden.
Listing1 das Fetchmail Schema
attributetype ( 1.1.2.1.1.1 NAME ( 'FMMail' ) DESC 'The mail adress wehre the mails fetched from' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{255} SINGLE-VALUE ) attributetype ( 1.1.2.1.1.2 NAME ( 'FMMailServerType' ) DESC 'The mailservertype POP3, IMAP ...' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} SINGLE-VALUE ) attributetype ( 1.1.2.1.1.3 NAME ( 'FMMailServer' ) DESC 'The mailserver DNS name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} SINGLE-VALUE ) attributetype ( 1.1.2.1.1.4 NAME ( 'FMUserName' ) DESC 'The username for loginto the mailserver' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} SINGLE-VALUE ) attributetype ( 1.1.2.1.1.5 NAME ( 'FMUserPasswd' ) DESC 'The passwd for loginto the mailserver' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} SINGLE-VALUE ) attributetype ( 1.1.2.1.1.6 NAME ( 'FMFetchMode' ) DESC 'The fetchmailmode kep, all ...' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{16} SINGLE-VALUE ) objectClass ( 1.1.2.2.1.1 NAME 'FMFetchMail' DESC 'Additional Objectclass for FetchMail' MUST (FMMail $ FMMailServerType $ FMMailServer $ FMUserName $ FMUserPasswd $ FMFetchMode))
Das Schema sollte nun noch in die /etc/ldap/slap.conf
... include=/schema/fetchmail.schema ...
Nun ist der Server fertig und es kann an den LDAP-Baum gehen :-)
Konfiguration des LDAP Servers
Der LDAP Server ist ein Verzeichnisserver, das heisst, es muss eine Baumstruktur aufgebaut werden, die man in *.ldif Dateien beschreibt.
Generell kann unsere LDAP-Server-Konfiguration in die folgenden Teile zerlegt werden, wobei sich der letzte Teil für jeden Benutzer wiederholt.
Anlegen des Stamms zu erkennen an objectClass: top
dn: dc=attanet,dc=de dc: attanet o: attanet objectClass: top objectClass: dcObject objectClass: organization
Anlegen eines neuen Astes mit Namen UserObjects
dn: ou=UserObjects,dc=attanet,dc=de objectClass: top objectClass: organizationalUnit ou: UserObjects
Anlegen des LDAP Administrator
dn: cn=admin,dc=attanet,dc=de cn: admin description: LDAP administrator objectClass: simpleSecurityObject objectClass: organizationalRole userPassword: Geheim
In den Ast UserObjects einen Benutzer "ansgar" einfügen
dn: uid=ansgar, ou=UserObjects,dc=attanet,dc=de objectclass: person objectclass: uidObject cn: Ansgar Jazdzewski sn: Jazdzewski uid: ansgar mail: ansgar@attanet.de userPassword: Geheim
Fügt dem User Ansgar ein Postfach hinzu, das für ihn abgeholt werden soll
dn: FMMail=Spam@web.de,uid=ansgar,ou=UserObjects,dc=attanet,dc=de objectClass: top objectclass: fetchmail FMMail: Spam@web.de FMMailServerType: pop3 FMMailServer: pop3.web.de FMUserName: Spam FMUserPasswd: secret FMFetchMode: all
Und noch eine Weitere Email-Adresse, die abgeholt werden soll
dn: FMMail=Spam@gmx.de,uid=ansgar,ou=UserObjects,dc=attanet,dc=de objectClass: top objectclass: fetchmail FMMail: Spam@gmx.de FMMailServerType: pop3 FMMailServer: pop.gmx.de.de FMUserName: Spam FMUserPasswd: secret FMFetchMode: all
Fügt man nun die Teile zu einer ldif-Datei zusammen und führt sie mit dem Befehl
slapadd -l /pfad/zur/datei.lidf
aus, dann ergibt sich folgende Struktur:
de | +- attanet -+ | +- UserObject -+ | +- ansgar -+ | | | +- FMMail=Spam@web.de | | | +- FMMail=Spam@gmx.de | +- ... | +- ...
Fetchmail Starten
Der LDAP-Server ist soweit fertig; nun können wir uns um das eigentliche Sammeln der Mails kümmern, dazu legen wir einen neues Bash-Skript an mit dem Namen fetchmail-ldap.sh und speichern es im Verzeichnis /usr/local/bin/
Das Bash-Skript zum Lesen der Informationen aus dem LDAP und übergeben an Fetchmail
#!/bin/sh basedn="ou=Users,ou=OxObjects,dc=attanet,dc=de" username="cn=admin,dc=attanet,dc=de" #passwd=absdef users=`ldapsearch -LLL -h localhost -D $username -w abcdef -x -b $basedn uid | grep uid: | cut -d ' ' -f 2 | sed -e 's/\n/ /g'` for user in $users; do searchbase="uid="$user","$basedn temp1=`ldapsearch -LLL -h localhost -D $username -w abcdef -x -b $searchbase mail FMMail` EMAILTO=`echo "$temp1" | grep mail: | cut -d ' ' -f 2 | sed -e 's/^$//g'` TOFETCH=`echo "$temp1" | grep FMMail: | cut -d ' ' -f 2 | sed -e 's/^$//g'` if [ "x$TOFETCH" != "x" ]; then for EMAILFROM in $TOFETCH; do fetchmailsearchbase="FMMail="$EMAILFROM",uid="$user","$basedn temp=`ldapsearch -LLL -h localhost -D $username -w abcdef -x -b $fetchmailsearchbase FMMailServer FMMailServerType FMUserName FMUserPasswd FMFetchMode` SERVERNAME=`echo "$temp" | grep FMMailServer: | cut -d ' ' -f 2 | sed -e 's/^$//g'` PROTOCOL=`echo "$temp" | grep FMMailServerType: | cut -d ' ' -f 2 | sed -e 's/^$//g'` NAME=`echo "$temp" | grep FMUserName: | cut -d ' ' -f 2 | sed -e 's/^$//g'` PASSWORD=`echo "$temp" | grep FMUserPasswd: | cut -d ' ' -f 2 | sed -e 's/^$//g'` MODE=`echo "$temp" | grep FMFetchMode: | cut -d ':' -f 2 | sed -e 's/^$//g'` echo "poll $SERVERNAME protocol $PROTOCOL username \"$NAME\" password \"$PASSWORD\" $MODE to $EMAILTO" | fetchmail -f - done fi done
Zum Schluß muss nun nur noch fetchmail in regelmäßigen Abständen gestartet werden, das kann man auf vielen Wegen erreichen als Daemon, als Skript beim Aufbau einer Internetverbindung (bei Modem- oder ISDN-Anbindung), oder mit einem Cronjob, auf den ich hier eingehen möchte, da ich fetchmail so benutze ;-)
Also eine Datei mit Namen fetchmail in /etc/cron.d/ anlegen und mit folgenden Inhalt füllen
# /etc/cron.d/fetchmail: crontab fragment for fetchmail # Look for and purge old sessions every 15 minutes 00,15,30,45 * * * * fetchmail /usr/local/bin/fetchmail_ldap.sh > /dev/null
nun noch ein
/etc/init.d/cron restart
und fetchmail lauft.
Fragen, Anregungen und Verbesserungen
Solltet ihr Fragen an mich haben, dann bitte ich euch, mir einfach eine Mail zu schreiben! AnsgarJ@gmx.de
Ich hoffe, ich konnte euch nun ein wenig helfen!