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!

Von "http://lug-wr.de/wiki/index.php/Fetchmail"

Diese Seite wurde bisher 10711 mal abgerufen. Diese Seite wurde zuletzt geändert um 23:53, 23. Mär 2006. Inhalt ist verfügbar unter der GNU Free Documentation License 1.2.