#pragma section-numbers on

'''Inhalt'''

<<TableOfContents>>

----

Maildrop ist ein Teil des  [[Courier]] MailServer``s, der auch einzeln verwendet werden kann. Maildrop ist ein sogenannter [[MDA]].

Maildrop lässt sich deutlich besser konfigurieren als [[procmail]] - dazu wird im Homeverzeichnis eine Datei {{{.mailfilter}}} angelegt.

Homepage: http://www.flounder.net/~mrsam/maildrop/

Lizenz: [[GPL]]

= Beispiel einer .mailfilter =

Hier das Beispiel von [[procmail]] für maildrop:

{{{
DEFAULT=Maildir/
logfile $DEFAULT/maildrop.log 

xfilter "/usr/local/bin/spamassassin -P"

if (/^X-Spam-Status: Yes/)
 to $DEFAULT/.Spam/ 
 
if (/^Subject: Cron/)
 to $DEFAULT/.System/ 
 
if (/^From wiki@/)
 to $DEFAULT/.Wiki/ 
 
if (/^Subject:.*\[hylafax-users\]/)
 to $DEFAULT/.Hylafax/ 
 
if (/^Return-Path:.*syslinux/)
 to $DEFAULT/.Syslinux/ 
}}}

= Tipps & Tricks =

Die `.mailfilter` Datei darf nur vom Besitzer les- und schreibbar sein, maildrop verweigert sonst aus Sicherheitsgründen die Arbeit. Um die richtigen Rechte zu setzen, kann man folgenden Befehl ausführen: {{{chmod 600 ~/.mailfilter}}}

Wenn man [[Maildir]]s benutzt, muss man darauf achten, dass diese vorhanden sind, wenn man dorthin ausliefern will.

/!\ Wenn man Weiterleitungen an andere Adressen aktiv hat, sollte man darauf achten, Fehlermeldungen des Mailservers nicht weiterzuleiten, sonst kann es zu ärgerlichen Mail-Schleifen kommen.
{{{
if (/^Return-Path: <>/)
 to Maildir/
}}}

== Mailinglisten ==
Für MailingListe``n empfiehlt sich folgende Pattern-Syntax (Beispiele), je nach MailingListenManager:

 Courier mlm::
  {{{/^List-Post: <mailto:vlug-public@vlugnet.org>/}}}

 GNU mailman::
  {{{/^List-Id:.*<fsfe-de\.fsfeurope\.org>/}}}

 ezmlm::
  {{{/^Mailing-List: contact getmail-help@discworld\.dnsalias\.org/}}}

 majordomo::
  {{{/^Sender: owner-vlug@listserv\.uni-stuttgart\.de/}}}

== Weiterleitung ==
Beim Weiterleiten von Mails an einen anderen Server, kann es vorkommen, dass dieser die Mail nicht akzeptiert, da die Absenderadresse nicht mit dem sendenden Rechner übereinstimmt (besonders bei Mails von großen Hostern wie Yahoo oder AOL).

Als Lösung kommen mehrere Möglichkeiten in Frage:
 * Weiterleitung der Mails als Anhang
 {{{
if (/^Subject:.*/) SUBJECT=$MATCH
xfilter "makemime -c message/rfc822 -e quoted-printable -a 'Mime-Version: 1.0' -a $SUBJECT -"
to "!weiterleitungsadresse@anderer.server"
}}}
 * Ändern des "From:"-Headers
 {{{
xfilter "reformail -R From: X-Original-From: -I'From: <meineadresse@meinserver>'"
to "!weiterleitungsadresse@anderer.server"
}}}
 * dem Server beibringen, alle Mails zu akzeptieren

== Syntaxprüfung ==
{{{
echo | maildrop -V 1 2>/dev/null && echo "OK" || echo "Error $?"
}}}
Maildrop beendet sich mit Fehlercode 75 (temporärer Fehler), wenn die Berechtigungen nicht in Ordnung sind oder die Syntax fehlerhaft ist.

= Weitere Beispiele =

Hier sind weitere Beispiele für maildrop-Filterregeln (teilweise basierend auf der maildropex ManPage).

== Muster ==

Siehe auch RegularExpressions.

komplette E-Mail-Adresse
 {{{
/^From: .*user@example\.com/
}}}

alles von hotmail.com außer fritz
 {{{
/^From: .*@hotmail\.com/ && !/^From: .*fritz@hotmail\.com/
}}}

Zeichenkette ('''case-insensitive''')
 {{{
/^From: .*Max Mustermann/
}}}

Zeichenkette ('''case-sensitive''')
 {{{
/^From: .*Max Mustermann/:D
}}}

Zeichenkette im Body
 {{{
/blafusel/:b
}}}

== Regeln ==

Speichere eine Kopie jeder Mail im Unterordner backup und behalte nur die 50 letzten.
 {{{
cc Maildir/.backup
`cd Maildir/.backup/new && ls -t | sed -n 51,\$p | xargs -r rm`
}}}

OffeneFrage: Ich möchte gerne die Einträge in to und cc absuchen und in E-Mail-Adressen aufspalten. Normalerweise käme man mit getaddr(...) aus, doch diese Funktion liefert aus 
{{{
"joe@domain.tld, "Alex Smith" <alex@domain.tld>, tom@domain.tld"
}}}
(siehe Manual) nur 
{{{
"joe@domain.tld<NL>alex@domain.tld<NL>tom@domain.tld<NL>".
}}}
Ich möchte aber in einem weiteren Teil "Alex Smith" abtrennen können - wo diese Werte vorhanden sind. Meinen Namen kenne ich, der Spammer - so er einen Namen benutzt kennt ihn nicht und so würde ich - falls vorhanden und falsch - dies als Kriterium für Spam werten wollen. Mein erster Versuch bezieht sich auf die To-Zeile und lautet: 
{{{
logfile logfile.txt

log "Tests: TO an CC"

if (/^To: (.*)$/)
{
  ADRS = tolower($MATCH1)
  log "To-Zeile: $ADRS"
  foreach /(.*)(,$)/
  {
    ADR = "$MATCH1"
    log "Weiterer Adresse: $ADR"
  }
}
}}}
Aber das funktioniert nicht. Hier bräuchte man ein foreach-Beispiel, dass zeigt, wie es geht.
----
KategorieAnleitung