Good to Know Database

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?

Von 4 Min. Lesezeit

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.

Quellen