Fehlerbehebung · Ubuntu
Ubuntu-Cron sendet keine E-Mail? Warum, und was Sie stattdessen tun sollten
Warum Cron-Ausgabe-E-Mails auf einem Ubuntu/Debian-VPS nie ankommen — kein MTA, MAILTO, Spamfilterung — und eine zuverlässigere Alternative.
Standardmäßig mailt Cron die Ausgabe eines Jobs an den lokalen Benutzer — aber auf einem Standard-Ubuntu/Debian-VPS geht diese Mail meist ins Leere. Hier das Warum und was Sie tun sollten.
1. Es ist kein Mail Transfer Agent installiert
Ein minimaler Server hat keinen MTA, sodass Cron nichts hat, dem es Mail übergeben kann. Prüfen Sie:
which sendmail
systemctl status postfix
Existiert keines davon, wird Cron-Ausgabe einfach verworfen. Sie können einen leichten MTA installieren:
sudo apt update && sudo apt install -y postfix mailutils
# wählen Sie "Internet Site" (oder "Satellite", um über einen Smarthost zu relayen)
2. Setzen Sie MAILTO
Cron sendet die Ausgabe an den Eigentümer der Crontab, sofern nicht anders angegeben. Setzen Sie eine echte Adresse am Anfang der Crontab:
MAILTO="ops@example.com"
0 2 * * * /opt/app/run.sh
Keine Ausgabe bedeutet keine E-Mail — Cron mailt nur, wenn ein Job nach stdout/stderr schreibt.
3. Ihre Mail wird als Spam verworfen
Selbst mit MTA wird Mail, die direkt von einer beliebigen VPS-IP gesendet wird, sehr wahrscheinlich abgelehnt oder aussortiert: kein SPF, kein DKIM, kein Reverse-DNS, und die IP steht womöglich auf einer Blockliste. Ein Relay über einen echten Anbieter (Smarthost / SMTP-Relay) behebt die Zustellbarkeit, ist aber echte Arbeit in Einrichtung und Pflege.
4. Testen Sie den Pfad von Anfang bis Ende
echo "test body" | mail -s "cron mail test" ops@example.com
tail -f /var/log/mail.log
Zeigt das Log die Nachricht als deferred oder bounced, ist es ein Zustellbarkeitsproblem, kein Cron-Problem.
Ein zuverlässigerer Ansatz als Cron-E-Mail
Cron-E-Mail ist von Natur aus fragil: Sie feuert nur bei Ausgabe, hängt von einem MTA ab, den Sie betreiben müssen, und landet im Spam. Am schlimmsten: Wenn der Job ganz aufhört zu laufen, gibt es keine Ausgabe — also keine E-Mail, und Sie hören nichts.
Drehen Sie es um: Statt Sie zu mailen, wenn ein Job läuft, werden Sie alarmiert, wenn einer nicht läuft. Pingen Sie bei Erfolg einen Heartbeat an und lassen Sie einen Dienst auf die Stille achten:
0 2 * * * /opt/app/run.sh && curl -fsS https://ping.steadycron.com/<ihr-ping-token>
Fehlt der Ping oder ist verspätet, mailt (oder slackt oder pagt) SteadyCron Sie — kein lokaler MTA, keine SPF/DKIM-Kopfschmerzen, und es fängt den Fall ab, den Cron-E-Mail nie konnte: den Job, der aufgehört hat zu feuern.