Linuxgilt für Debian 12 und 13, Pi OS
Wie verschickt ein Linux-Server oder Raspberry Pi E-Mails?
Der Raspberry Pi oder der kleine Server soll Bescheid geben, wenn etwas passiert: ein Sensorwert zu hoch, ein Backup fertig, ein Cronjob fehlgeschlagen. Ein eigener Mailserver soll es nicht sein. Wie schickt der Rechner Mails über das vorhandene Postfach?
Lösung
Kurz: Mit msmtp. Es gibt jede Mail an den SMTP-Server des eigenen Postfachs weiter, mit Anmeldung und Verschlüsselung. Das Paket msmtp-mta stellt zusätzlich den Befehl sendmail bereit, damit Cron und andere Programme ihre Mails ebenfalls darüber schicken.
Installieren
sudo apt install msmtp msmtp-mta
Konfiguration
Die Datei /etc/msmtprc anlegen. Server, Port, Adresse und Passwort kommen vom eigenen
Mailanbieter, der Port 587 mit STARTTLS ist der übliche:
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
syslog LOG_MAIL
account postfach
host smtp.example.de
port 587
from pi@example.de
user pi@example.de
password geheim
account default : postfach
Weil das Passwort im Klartext darin steht, die Datei vor fremden Blicken schützen:
sudo chmod 600 /etc/msmtprc
Am besten richtet man beim Mailanbieter ein eigenes Postfach oder ein App-Passwort nur für den Pi ein. Dann hängt nicht das Hauptpostfach an einer Datei auf dem Pi.
Testen
printf "Subject: Test vom Pi\n\nEs funktioniert.\n" | sudo msmtp empfaenger@example.de
Kommt nichts an, steht der Grund im Systemprotokoll, sudo journalctl -t msmtp zeigt ihn.
Mehr verrät --debug am Ende des Befehls, das zeigt das ganze Gespräch mit dem Server. Die Ausgabe
kann dabei Zugangsdaten enthalten, also nirgends hineinkopieren.
Eine eigene Logdatei per logfile geht auch. Unter /var/log darf aber nur root
schreiben, und ist unter Debian das mitgelieferte AppArmor-Profil für msmtp aktiv, erlaubt es dort nur
/var/log/msmtp. Das Systemprotokoll umgeht beides.
Nachträge
Wie schicke ich eine Mail aus Python?
Mit dem mitgelieferten Modul smtplib, ohne msmtp:
import smtplib
import ssl
from email.message import EmailMessage
nachricht = EmailMessage()
nachricht["Subject"] = "Temperatur zu hoch"
nachricht["From"] = "pi@example.de"
nachricht["To"] = "empfaenger@example.de"
nachricht.set_content("Der Sensor meldet 31 °C.")
with smtplib.SMTP("smtp.example.de", 587) as server:
server.starttls(context=ssl.create_default_context())
server.login("pi@example.de", "geheim")
server.send_message(nachricht)
Was ist mit sendEmail und ssmtp aus älteren Anleitungen?
Beide gibt es in Debian 12 und 13 noch als Paket, sendEmail aber seit Jahren unverändert in Version 1.56.
msmtp wird laufend weiterentwickelt und kann alles, was hier gebraucht wird: Anmeldung, STARTTLS und den
Befehl sendmail für Cron. Für neue Einrichtungen ist es deshalb die bessere Wahl.
Wann lohnt sich Postfix?
Wenn Mails auch dann zuverlässig raus sollen, wenn der SMTP-Server kurz nicht erreichbar ist. Postfix hält sie in einer Warteschlange und versucht es später erneut, msmtp gibt sofort einen Fehler zurück. Für gelegentliche Benachrichtigungen reicht msmtp.
Warum landen die Mails im Spam?
Meist passt die Absenderadresse nicht zum Postfach, über das gesendet wird. Absender und Anmeldung sollten dieselbe Adresse sein. Was SPF, DKIM und DMARC damit zu tun haben, erklärt redirect301.de unter E-Mail-Authentifizierung.