Abrufen von E-Mails auf entfernten Servern mit getmail (Debian Etch)

Version 1.0
Author: Falko Timme


Getmail ist ein Programm zum Abrufen von E-Mails von entfernten Servern; es ist ziemlich ähnlich wie fetchmail, nur flexibler. Es kann zum Beispiel so konfiguriert werden, die Mails direkt an eine Maildir oder mbox mailbox weiterzuleiten ohne von einem MTA wie Postfix Gebrauch zu machen. Aber selbstverständlich kann es die Mails auch durch einen MTA leiten, wenn Du magst. Getmail kann sogenannte Filter verwenden, wie SpamAssassin und ClamAV um Mails zu überprüfen und Du kannst getmail sogar veranlassen, Mails nach einer bestimmten Anzahl von Tagen auf dem originalen Server zu löschen.

Ich übernehme keine Garantie, dass dies auch bei Dir funktionieren wird!

1 Vorbemerkung

Ich habe getmail auf einem Debian Etch System mit dem lokalen Benutzer falko getestet, der die lokale E-Mail Adresse falko@example.com hat.

2 Installation von getmail

Um getmail zu installieren, müssen wir nur Folgenden Befehl

apt-get install getmail4

als Root-Benutzer ausführen.

3 Konfiguriere getmail

Getmail kann durch Konfigurationsdateien pro Benutzer konfiguriert werden. Dieser eine Benutzer kann getmail dann laufen lassen. Damit getmail automatisch läuft, erstellen wir für diesen Benutzer einen Cron Job.

Ich gehe davon aus, dass Du in diesem Kapitel als falko und nicht als root angemeldet bist!

Getmail sucht nach der Konfigurationsdatei ~/.getmail/getmailrc, also müssen wir zunächst das Verzeichnis ~/.getmail mit der Berechtigung 0700 erstellen:

mkdir -m 0700 ~/.getmail

Dann erstellen wir die ~/.getmail/getmailrc Konfigurationsdatei. Eine getmailrc Datei muss zumindest einen [retriever] Bereich und einen [destination] Bereich haben.

vi ~/.getmail/getmailrc


[retriever]
type = SimplePOP3Retriever server = pop.someprovider.tld username = falko@someprovider.tld password = secret [destination] type = Maildir path = ~/Maildir/
Das obige Beispiel geht davon aus, dass falko ein E-Mail Konto mit dem Benutzernamen falko@someprovider.tld und dem Passwort secret auf dem Server pop.someprovider.tld hat und dass er ein Maildir Konto auf diesem Server hat, mit ~/Maildir/ als sein Maildir Verzeichnis.

Das reicht schon um getmail zu konfigurieren. falko könnnte nun E-Mails von dem entfernten Server abrufen indem er einfach Folgendes laufen lässt

getmail

Natürlich möchte falko diesen Vorgang nicht immer aller paar Minuten manuell starten, also erstellen wir für ihn einen Cron Job. Immer noch als Benutzer falko lassen wir dies laufen

crontab -e

und erstelllen einen Cron Job wie diesen (der getmail jede fünf Minuten starten würde):
*/5 * * * * /usr/bin/getmail &> /dev/null
Lass uns nun davon ausgehen, dass falko kein Maildir Konto hat, aber ein mbox Konto auf diesem Server (/var/mail/falko). Wir müssen nur den [destination] Bereich in ~/.getmail/getmailrc ändern, z.B. wie folgt:

vi ~/.getmail/getmailrc


[retriever]
type = SimplePOP3Retriever server = pop.someprovider.tld username = falko@someprovider.tld password = secret [destination] type = Mboxrd path = /var/mail/falko
Im nächsten Beispiel möchten wir die E-Mails, die wir auf dem entfernten Server abrufen, durch einen MTA wie zum Beispiel Postfix leiten (ich gehe davon aus, dass Postfix bereits installiert ist und funktioniert). Postfix kann dann entscheiden, ob es die Mails zu einer Maildir oder mbox leitet und es kann außerdem einen Spam und Virus Scanner aufrufen, z.B. durch amavisd-new.

vi ~/.getmail/getmailrc


[retriever]
type = SimplePOP3Retriever server = pop.someprovider.tld username = falko@someprovider.tld password = secret [destination] type = MDA_external path = /usr/sbin/sendmail arguments = ("-bm", "falko@example.com") unixfrom = true
(Wie Du siehst, teilen wir getmail mit, dass falkos lokale E-Mail Adresse falko@example.com ist.)

3.1 Optionen

Wir können auch einen [options] Bereich ~/.getmail/getmailrc hinzufügen, in dem wir das Standardverhalten von getmail ändern können, z.B. wie folgt:

vi ~/.getmail/getmailrc


[...]
[options] verbose = 1 read_all = false delete = true message_log_syslog = true
Die obigen Optionen veranlassen getmail, Nachrichten über abgerufene Nachrichten zu drucken, nur neue Nachrichten abzufragen, Nachrichten nach dem Abruf auf dem entfernten Server zu löschen und in syslog zu protokollieren.

Wenn Du nur Mails, die älter als 10 Tage sind, löschen möchtest, kannst Du den [options] Bereich wie folgt ändern:

vi ~/.getmail/getmailrc


[...]
[options] verbose = 1 read_all = false delete_after = 10 message_log_syslog = true
Hier erfährst Du mehr über alle verfügbaren Optionen: http://pyropus.ca/software/getmail/configuration.html#conf-options.

4 SpamAssassin In getmail Integrieren

Wenn Du möchtest, dass getmail SpamAssassin aufruft, kannst Du dies wie folgt ausführen:

Zunächst müssen wir SpamAssassin installieren. Als Rootanwender lassen wir Folgendes laufen

apt-get install spamassassin spamc

Dann müssen wir SpamAssassin konfigurieren. Das kann in der Datei /etc/mail/spamassassin/local.cf ausgeführt werden. Eine gültige Datei könnte wie folgt aussehen:

vi /etc/mail/spamassassin/local.cf


rewrite_header Subject *****SPAM*****
required_score 5.0 use_bayes 1 bayes_auto_learn 1 bayes_ignore_header X-Bogosity bayes_ignore_header X-Spam-Flag bayes_ignore_header X-Spam-Status bayes_ignore_header X-getmail-filter-classifier
(Die Kommentare in /etc/mail/spamassassin/local.cf verraten Dir mehr über die obigen Einstellungen.)

Wenn Du Bayes aktivierst (use_bayes 1), ist es wichtig, dass Du die Zeile

bayes_ignore_header X-getmail-filter-classifier

in /etc/mail/spamassassin/local.cf hinzufügst, sodass Bayes headers, die von getmail hinzugefügt werden, ignoriert.

Letztendlich müssen wir den SpamAssassin daemon freischalten indem wir ENABLED auf 1 in /etc/default/spamassassin stellen:

vi /etc/default/spamassassin


[...]
ENABLED=1 [...]
Dann starten wir den SpamAssassin daemon:

/etc/init.d/spamassassin start

Melde Dich nun wieder als falko in der Kommandozeile an, öffne ~/.getmail/getmailrc und füge den folgenden [filter] Bereich hinzu:

vi ~/.getmail/getmailrc


[...]
[filter] type = Filter_external path = /usr/bin/spamc arguments = ("-s 250000", )
(Wenn dies nicht Dein erster [filter] Bereich ist, musst Du den ersten [filter] Bereich zu [filter-1] umbenennen, den zweiten zu [filter-2] usw.)

Das war's. SpamAssassin ist nun in getmail integriert.

5 ClamAV Integrieren

ClamAV ist ein Projekt, das sehr oft neue Versionen veröffentlicht und wenn einmal eine neue Version veröffentlicht wurde, werden alte Versionen Warnungen ausgeben. Daher müssen wir sicherstellen, dass wir die neuste ClamAV Veröffentlichung installieren, indem wir folgende Zeile zu /etc/apt/sources.list inzufügen (als root):

vi /etc/apt/sources.list


[...]
deb http://volatile.debian.org/debian-volatile etch/volatile main contrib non-free [...]
Danach aktualisieren wir unsere Datenbank:

apt-get update

(- falls Du GPG Warnungen erhältst, kannst Du diese ignorieren -)

und installieren ClamAV:

apt-get install clamav clamav-base clamav-daemon clamav-freshclam

Melde Dich dann wieder als Benutzer falko an und bearbeite ~/.getmail/getmailrc. Wenn Du möchtest, dass getmail Virus-Mails löscht, dann füge folgenden Filter hinzu:

vi ~/.getmail/getmailrc


[...]
# Drop infected messages [filter] type = Filter_classifier path = /usr/bin/clamdscan arguments = ("--stdout", "--no-summary", "-") exitcodes_drop = (1, )
Wenn Du möchtest, dass getmail infizierte Nachrichten abliefert, füge stattdessen folgenden Filter hinzu:

vi ~/.getmail/getmailrc


[...]
# Keep infected messages [filter] type = Filter_classifier path = /usr/bin/clamddscan arguments = ("--stdout", "--no-summary", "-") exitcodes_keep = (0,1)
Denke daran, was ich im vorherigen Kapitel über mehrere [filter] Bereiche gesagt habe:

Wenn dies nicht Dein erster [filter] Bereich ist, musst Du den ersten [filter] Bereich zu [filter-1] umbenennen, den zweiten zu [filter-2] usw.

Das war die Integration von ClamAV.

6 Eine Muster-Konfigurationsdatei

So sieht meine ~/.getmail/getmailrc letztlich aus:

vi ~/.getmail/getmailrc


[retriever]
type = SimplePOP3Retriever server = pop.someprovider.tld username = falko@someprovider.tld password = secret [destination] type = Maildir path = ~/Maildir/ [options] verbose = 1 read_all = false delete = true message_log_syslog = true [filter-1] type = Filter_classifier path = /usr/bin/clamdscan arguments = ("--stdout", "--no-summary", "-") exitcodes_keep = (1, ) [filter-2] type = Filter_external path = /usr/bin/spamc arguments = ("-s 250000", )

7 Weitere Beispiele für Konfigurationen

Weitere Beispiele für Konfigurationen findest Du auf http://pyropus.ca/software/getmail/configuration.html und in der getmailrc-Beispiel Datei, die sich in der getmail .tar.gz Datei befindet, die Du von folgender Seite runter laden kannst http://pyropus.ca/software/getmail. Hier ist der Inhalt dieser Datei:

#
# This file contains various examples of configuration sections to use
# in your getmail rc file. You need one file for each mail account you
# want to retrieve mail from. These files should be placed in your
# getmail configuration/data directory (default: $HOME/.getmail/).
# If you only need one rc file, name it getmailrc in that directory,
# and you won't need to supply any commandline options to run getmail.
#

#
# Example 1: simplest case of retrieving mail from one POP3 server and
# storing all messages in a maildir.
#

[retriever]
type = SimplePOP3Retriever
server = pop.example.net
username = jeff.plotzky
password = mailpassword

[destination]
type = Maildir
path = ~jeffp/Maildir/

#
# Example 2: same as (1), but operate quietly, delete messages from
# the server after retrieving them, and log getmail's actions to a file.
#

[options]
verbose = 0
delete = true
message_log = ~/.getmail/log

[retriever]
type = SimplePOP3Retriever
server = pop.example.net
username = jeff.plotzky
password = mailpassword

[destination]
type = Maildir
path = ~jeffp/Maildir/

#
# Example 3: same as (1), but the mail account is accessed via IMAP4 instead
# of POP3.
#

[retriever]
type = SimpleIMAPRetriever
server = mail.example.net
username = jeff.plotzky
password = mailpassword

[destination]
type = Maildir
path = ~jeffp/Maildir/

#
# Example 4: same as (3), but retrieve mail from the INBOX, INBOX.spam, and
# mailing-lists.getmail-users mail folders.
#

[retriever]
type = SimpleIMAPRetriever
server = mail.example.net
username = jeff.plotzky
password = mailpassword
mailboxes = ("INBOX", "INBOX.spam", "mailing-lists.getmail-users")

[destination]
type = Maildir
path = ~jeffp/Maildir/

#
# Example 5: same as (3), but move messages to the mail folder "sent-mail"
# after retrieving them. Note that you do this by setting delete and
# move_on_delete options.
#

[options]
delete = true

[retriever]
type = SimpleIMAPRetriever
server = mail.example.net
username = jeff.plotzky
password = mailpassword
move_on_delete = sent-mail

[destination]
type = Maildir
path = ~jeffp/Maildir/

#
# Example 6: same as (1), but deliver the messages to an mboxrd-format mbox
# file as user "jeffp".
#

[retriever]
type = SimplePOP3Retriever
server = pop.example.net
username = jeff.plotzky
password = mailpassword

[destination]
type = Mboxrd
path = ~jeffp/Mail/inbox
user = jeffp

#
# Example 7: same as (1), but deliver the messages through an external MDA
# which takes several arguments.
#

[retriever]
type = SimplePOP3Retriever
server = pop.example.net
username = jeff.plotzky
password = mailpassword

[destination]
type = MDA_external
path = /usr/local/bin/my-mda
arguments = ("--message-from-stdin", "--scan-message", "--to-maildir",
"~jeffp/Maildir/")

#
# Example 8: retrieve mail from a corporate POP3-SSL domain mailbox,
# sort messages for several local users and deliver to maildirs in their
# home directories (except Sam, who likes mbox files, and Christina, who
# uses procmail for further sorting), and deliver all other mail to
# Joe, who serves as postmaster for the company. Sam also needs
# to receive mail for "sam1", "sam23", etc, so we use a regular expression
# matching "sam" plus zero or more decimal digits.
#

[retriever]
type = MultidropPOP3SSLRetriever
server = pop.example.net
username = companylogin
password = mailpassword
# Our domain mailbox mailhost records the envelope recipient address in a
# new Delivered-To: header field at the top of the message.
envelope_recipient = delivered-to:1

[destination]
type = MultiSorter
default = [postmaster]
locals = (
("jeffk@company.example.net", "[jeff]"),
("martinh@company.example.net", "[martin]"),
(r"samD*@company.example.net", "[sam]"),
("c.fellowes@company.example.net", "[christina-procmail]")
)

[postmaster]
type = Maildir
path = ~joe/Mail/postmaster/
user = joe

[jeff]
type = Maildir
path = ~jeffp/Maildir/
user = jeffp

[martin]
type = Maildir
path = ~martinh/Maildir/
user = martinh

[sam]
type = Mboxrd
path = ~sam/Mail/inbox
user = sam

[christina-procmail]
type = MDA_external
path = /usr/local/bin/procmail
# procmail requires either that the message starts with an mboxrd-style
# "From " line (which getmail can generate by setting "unixfrom" to True), or
# that the -f option is provided as below.
arguments = ("-f", "%(sender)", "-m", "/home/christina/.procmailrc")
user = christina

#
# Example 9: same as (3), but use SpamAssassin to filter out spam,
# and ClamAV to filter out MS worms.
#

[retriever]
type = SimpleIMAPRetriever
server = mail.example.net
username = jeff.plotzky
password = mailpassword

[filter-1]
type = Filter_external
path = /usr/local/bin/spamc

[filter-2]
type = Filter_classifier
path = /usr/local/bin/clamscan
arguments = ("--stdout", "--no-summary",
"--mbox", "--infected", "-")
exitcodes_drop = (1,)

[destination]
type = Maildir
path = ~jeffp/Maildir/

#
# Example 10: same as (3), but deliver all mail to two different local
# mailboxes.
#

[retriever]
type = SimpleIMAPRetriever
server = mail.example.net
username = jeff.plotzky
password = mailpassword

[destination]
type = MultiDestination
destinations = (
"~jeff/Maildir/",
"/var/log/mail-archive/current",
)

#
# Example 11: retrieve mail from a simple (non-multidrop) POP3 mailbox.
# Then extract addresses from the message header (see documentation for which
# fields are examined), and deliver mail containing the address
# <list1@domain.example.net> to ~/Mail/lists/list1/, mail containing the
# address <list2@otherdomain.example.com> to ~/Mail/lists/list2/,
# mail containing the address <othername@example.org> to ~/Mail/other/,
# and all other mail gets delivered through the external MDA program
# "my-mda" with some default arguments.
#

[retriever]
type = SimplePOP3Retriever
server = pop.example.net
username = jeff.plotzky
password = mailpassword

[destination]
type = MultiGuesser
default = [my-mda]
locals = (
("list1@domain.example.net", "~/Mail/lists/list1/"),
("list2@otherdomain.example.com", "~/Mail/lists/list2/"),
("othername@example.org", "~/Mail/other/"),
)

[my-mda]
type = MDA_external
path = /path/to/my-mda
arguments = ("-f", "%(sender)", "${HOME}/.mymdarc")

Sieh Dir außerdem die getmail Man Page an:

man getmail

um mehr über verfügbare Kommandozeilenparameter für getmail zu erfahren.

8 Links