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.