Eine kleine Sammlung (kein HOWTO) von Erfahrungen zu Postfix: Befehle, wichtige Konfigurationsdateien, Smart-Host einstellen, Absenderadresse ohne Hostanteil, Aliase und andere Nachschlageverzeichnisse, Operationen an der Mailqueue
Anders als bei Sendmail gibt es bei Postfix einige für die jeweilige Aufgabe spezialisierte Programme. Dabei wird auch auf "Privilege Separation" 1) geachtet: Der Prozess "master" läuft noch als root, alles andere üblicherweise unter dem speziellen Benutzer "postfix".
Was welcher Prozess macht und wie das grundsätzlich mit dem Mail-Empfangen und Ausliefern funktioniert, findet man am besten im Postfix Overview(englisch)
So sieht das aus, wenn man pstree auf einem meiner Mailserver ausführt:
master─┬─2*[bounce(postfix)] ├─2*[cleanup(postfix)] ├─local(postfix) ├─pickup(postfix) ├─qmgr(postfix) ├─5*[smtp(postfix)] ├─5*[smtpd(postfix)] └─trivial-rewrite(postfix)
Queue ansehen:
mailq
Mail-Inhalt ansehen
postcat -q mailid
Postfix postsuper
Befehl:
postsuper -d mailid
- DELETE - löschenpostsuper -h mailid
- hold - auf Eis legenpostsuper -H mailid
- unhold postusper -r mailid
- requeue - neu in die Mail-Queue stellen (evtl. Änderungen an Aliases, Zustellregeln usw. werden berücksichtigt)postsuper `mailq | awk '/Tue/ {print "-r " $1}'`
postsuper -r ALL
- alle Mails neu in die Queue stellenpostsuper -p
- "purge" - alte tmp-Dateien wegwerfenpostsuper -s
- structure check - bevor man Postfix startet, tut ein kleiner Systemcheck nicht weh ..geänderte Listen ("Lookup Table") und Aliase-Dateien
postalias /etc/aliases
- erzeugt eine neue alias.db postmap /etc/postfix/datei
liegen in meistens in /etc/postfix
.
/etc/aliases
oder /etc/postfix/aliases
- Mailzustell-Listemain.cf
- die wichtigsten Einstellungen des eigentlichen Mailservers sind hier - oder hier gesourced …. master.cf
- Parameter für den Start der einzelnen Prozesse und "Aussenkommunikation"main.cf und Konsorten beinhalten normalerweise sehr viele hilfreiche Kommentare → LESEN!
lokale Anpassungen und Änderungen passieren hauptsächlich in main.cf
.
Achtung SUSE: Yast hängt die Änderungen hinten an die main.cf an (solange man nichts von Hand geändert hat, danach lässt der Yast zum Glück die Datei so stehen).
Wenn die Mail nicht direkt über das Internet versendet werden soll, sondern über ein Relay namens "RechnernameoderIPAdresse"
in der main.cf
:
relayhost = [RechnernameoderIPAdresse]
(In eckigen Klammern, wenn das nicht mit den passenden DNS-Einstellungen zum MX passt)
wenn die Mail nicht von root@rechnername.example.com versendet werden soll, sondern von root@example.com …
in der main.cf
:
mydomain = example.com myorigin = $mydomain
Die "üblichen" Verzeichnisstypen / "Datenbanken" werden bei Postfix als Textdatei geschrieben und für's schnelle Lesen typischerweise in das Berkley-DB Format umgewandelt. Ausserdem kann Postfix auch Dateien mit Regulären Ausdrücken verarbeiten 2) Relationale Datenbanken (MySQL, Postgres), Verzeichnisdiensten wie LDAP oder NIS+ sind auch möglich (LDAP und NIS habe ich aber noch nicht verwendet).
Erfahrungswert: Im Gegensatz zu sendmail mag Postfix die Einträge in seinen Nachschlage-Tabellen kleingeschrieben - wenn da Anna.Beispiel steht, wird evtl. die Mail an anna.beispiel nicht angenommen … Andersherum schon (wenn in der Tabelle anna.beispiel steht, wird Anna.Beispiel auch angenommen).
genau wie bei Sendmail ….
Format:
key: wert
Beispiel: /etc/aliases
aliases - Trennzeichen ":"
root: me@example.com anna.beispiel: anna beispiels: anna,bertram,cecilie trash: /dev/null
Was tut das? Hier wird der Empfänger umgeschrieben.
/dev/null
gelegt - also weggeworfen
Voraussetzung: in der main.cf
gibt es den Eintrag alias_maps = hash:/etc/aliases
(Eine Alias-Datei gehört zur üblichen Default-Konfiguration)
Die passende Berkley-DB (aliases.db
) erzeugt man mit dem Befehl postalias /etc/aliases
- dieser Befehl muss nach jeder Änderung an der jeweiligen Textdatei ausgeführt werden.
Format:
key wert
Beispiel: sender_canonical
anna anna.beispiel@unixwitch.de
Was tut das? Hier wird der Absender umgeschrieben. Wenn der Benutzer "anna" Mails versendet, werden sie mit der Adresse anna.beispiel@unixwitch.de3) rausgeschickt.
Voraussetzung: in der main.cf
gibt es die Zeile
sender_canonical_maps = hash:/etc/postfix/sender_canonical
Die passende Berkley-DB (sender_canonical.db
) erzeugt man mit dem Befehl postmap /etc/postfix/sender_canonical
- dieser Befehl muss nach jeder Änderung an der jeweiligen Textdatei ausgeführt werden.
Einfaches Beispiel: Mails an viele Domains wird angenommen, aber normalerweise bekommt Anna Beispiel und alle anderen Benutzer immer die Mails unabhängig von der Domain (Mails an anna.beispiel@firma1.example.com oder anna.beispiel@company2.example werden ins selbe Postfach geleitet).
Aber: je nach Domain gibt es verschiedene Ansprechpartner, und die Mails an info@firma1.example.com soll an eine andere Adresse geleitet werden, als an info@company2.example.
Voraussetzung: in der main.cf
gibt es folgenden Eintrag:
recipient_canonical_maps = regexp:/etc/postfix/recipient_canonical-regexp
(Man kann sich natürlich auch einen weniger komplizierten Namen ausdenken …)
#/etc/postfix/recipient_canonical-regexp /^info@firma1.example.com/ ticketsystem@ticketserver.firma1.example.com /^info@company2.example/ company2-info@example.net
Dateien in den Postfix-Mail-Queues sind in einem Binary-Format, deswegen kann man sie bei Problemen nicht direkt ändern (anders als bei Sendmail) - wenn man es trotzdem versucht, werden sie von Postfix als "korrupt" markiert.
# postsuper -h MAILID
# postcat -q MAILID > /tmp/mail.txt
# vim /tmp/mail.txt
geplante Änderungen und
→ Zeilen am Anfang löschen: von (einschliesslich)
*** ENVELOPE RECORDS hold/MAILID ***
bis
*** MESSAGE CONTENTS hold/MAILID ***
→ Zeilen am Ende löschen: von (einschliesslich)
*** HEADER EXTRACTED hold/MAILID ***
bis
*** MESSAGE FILE END hold/MAILID ***
# sendmail -f sender@fromdomain.example empfaenger1@example.com empfaenger2@woanders.example.org < /tmp/mail.txt
postsuper -d MAILID
Alle Mails vom MAILER-DAEMON erst aus der Mailqueue rausholen und als Datei ablegen:
x=`mailq | awk '/MAILER-DAEMON/ {print $1}' |sed s/\!// ` for m in $x;do echo "== $m ==" ;echo; postcat -q $m > $m ; postsuper -d $m; echo ;done
$Kunde hat eine nicht sonderlich aktuelle Adressdatenbank, damit das Maillog über das Wochenende nicht volläuft, mal alle fehlerhaften Domains rausfinden 4) und diese Mails auf Hold legen:
for x in $nichtzustellbaredomains; do mailq |grep -B2 $x | awk '!/\(/ && $1 !~ /@/ && !/--/ &&!/!/ {print $1}' | xargs -n1 -i postsuper -h {} ; done
siehe auch:
gilt für alle Tipps, Tricks & Spickzettel:
dies sind einfache, teils banale Notizen für meinen persönlichen Gebrauch,
die hier eher zufällig auch öffentlich lesbar sind
(vielleicht hilft es ja jemandem weiter). Verwendung auf eigene Gefahr
Fehler-Hinweise, Dankesschreiben , etc. bitte an: web.21@unixwitch.de
weitere Tools / Spickzettel