Mailversand mit msmtp oder postfix
Wenn man einen Server betreibt, ist es oft sinnvoll sich über dessen Status informieren zu lassen. Hierzu bieten sich z.B. Push-Notifications an. Der kleinste gemeinsame Nenner ist jedoch oft immer noch die klassische E-Mail. Nahezu jedes Tool kann Statusberichte oder Fehlermeldungen per Mail zustellen. Darüber hinaus kann der Mailversand für Passwort-Reset-Funktionen und ähnliches genutzt werden.
Es lohnt sich also, sich damit einmal zu beschäftigen.
Man könnte sich jetzt natürlich einen Full-Features Mailserver mit Dovecot, Postfix und RoundCube zusammenzimmern. Einfacher ist es aber meist, sich die Mails an eine bestehende Mailadresse bei einem der zahlreichen Anbieter zu senden. Hierfür stehen verschiedene Tools zur Verfügung.
msmtp
Eines davon ist msmtp
. Es kann nicht besonders viel, aber eben genau das, was wir möchten und ist dabei erheblich einfacher zu konfigurieren, als ein vollständiger MTA.
Die Installation erfolgt mittels apt install msmtp libsecret-tools
. Anschließend erstellen wir die Datei /etc/msmtprc
und befüllen diese wie folgt:
defaults
port 587
tls on
tls_starttls on
account example
host smtp.example.org
from gpkvt@example.org
auth on
user gpkvt
password storingpasswordsinplaintextisabadidea
Die Angaben müssen natürlich zu den Einstellungen des jeweiligen Mailproviders passen. Diese veröffentlichen oft Anleitungen für die gängigen Mailprogramme, diese können hier einfach übernommen werden. Damit ist die Einrichtung dann auch schon abgeschlossen.
Anstatt das Kennwort direkt in die Konfigurationsdatei zu schreiben, können verschiedene andere Methoden genutzt werden. Näheres dazu findet sich in der Dokumentation zu msmtp unter https://marlam.de/msmtp/msmtp.html#Authentication
Wirklich gut gefällt mir davon allerdings keine, zumindest nicht auf einem Server, der ja völlig ohne Benutzerinteraktion in der Lage sein soll Mails zu versenden. Mein Mailprovider unterstützt zudem keinen direkten Login am SMTP, da es hier keinen wirklichen Standard für eine Zweifaktorauthentifizierung gibt.
Unter anderen deswegen habe ich mich für eine andere Methode entschieden.
postfix
Postfix ist einer der verbreitetsten Mail-Transport-Agents (MTAs), sehr mächtig und daher auch etwas aufwändiger in der Konfiguration. Außerdem gibt es unzählige Arten wie wir unser Ziel mittels Postfix erreichen können, auch die oben aufgeführte Möglichkeit sich bei unserem Mailkonto anzumelden wäre möglich. Postfix nennt den Mailserver unseres Mailproviders dann Smarthost
und reicht alle Mails an diesen weiter. In meinem Szenario nützt das natürlich nichts, da es wieder am Login bei meinem Provider scheitern würde.
Postfix wird mittels apt install postfix ssl-cert
installiert. Während der Installation werden uns einige Fragen gestellt. Hier können wir die Konfiguration entweder auf später verschieben, oder die Konfigurationsart Internet site
nutzen.
Die Konfiguration erfolgt hauptsächlich über die Datei /etc/postfix/main.cf
:
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 2
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level=may
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = localhost
relayhost =
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
tls_ssl_options = NO_RENEGOTIATION
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
myorigin = mail.example.org
myhostname = mail.example.org
mynetworks = 127.0.0.0/8 172.17.0.0/16 172.18.0.0/16 172.19.0.0/16
Die Dateien für die Zeilen smtpd_tls_cert_file
und smtpd_tls_key_file
können wir mit dem Befehl make-ssl-cert generate-default-snakeoil
erzeugen.
Die Werte für myorigin
und myhostname
sollten einem Domainnamen entsprechen, den wir unter unserer vollständigen Kontrolle haben, damit wir ggf. DNS-Einträge setzen können, die die Wahrscheinlichkeit erhöhen, dass unser Mailprovider unsere Mails nicht ablehnt oder ständig als SPAM deklariert. Haben wir keine solche Domain zur Verfügung kann auch schon ein dynamischer DNS-Eintrag helfen, der immer auf die IP unseres Routers verweist. In meinem Fall musste ich z.B. einen sog. SPF-Record setzen, der auf meine DynDNS-Adresse verweist.
Ob unser Mailprovider unsere Mails aber wirklich annimmt, kann man nur sagen, indem man es testet. Denn aus dessen Sicht sind wir einfach irgendwer, der im schlimmsten Fall auch noch eine Absenderadresse nutzt, die eigentlich unserem Postfach beim Mailprovider entspricht. Da liegt der Verdacht natürlich Nahe, dass wir böse Spammer sind. Mit ein wenig Rumprobieren klappt es aber meist und wenn nicht, muss man halt eben doch auf eine Authentifizierung beim Mailprovider zurückgreifen.
Wichtig ist noch die Zeile mynetworks
. Hier können wir z.B. die Subnetze unser Docker-Container eintragen, damit diese unsere Postfix-Instanz ebenfalls ohne Authentifizierung nutzen können.
Haben wir alles konfiguriert kann Postfix mittels systemctl start postfix
aktiviert werden. Den Mailversand können wir z.B. mittels echo test | mail -s test mail@example.org
testen. Sollte der Versand nicht klappen, hilft meist ein Blick in das Postfix-Logfile unter /var/log/mail.log
weiter.
Ebenfalls sehr wichtig ist es einen solchen MTA niemals offen ins Netz zu stellen. Zu groß ist die Gefahr, dass eine Unaufmerksamkeit oder Fehlkonfiguration das System zur Spamschleuder macht. Solange der Server aber nur in unserem Heimnetz erreichbar ist, sind wir hier auf der sicheren Seite.