Dépannage · Ubuntu
Cron Ubuntu n’envoie pas d’e-mail ? Pourquoi, et quoi faire à la place
Pourquoi les e-mails de sortie de cron n’arrivent jamais sur un VPS Ubuntu/Debian — pas de MTA, MAILTO, filtrage anti-spam — et une alternative plus fiable.
Par défaut, cron envoie la sortie d’une tâche par e-mail à l’utilisateur local — mais sur un VPS Ubuntu/Debian standard, ce courrier ne va généralement nulle part. Voici pourquoi, et quoi faire.
1. Aucun agent de transfert de courrier n’est installé
Un serveur minimal n’a pas de MTA, donc cron n’a rien à qui remettre le courrier. Vérifiez :
which sendmail
systemctl status postfix
Si aucun n’existe, la sortie de cron est simplement abandonnée. Vous pouvez installer un MTA léger :
sudo apt update && sudo apt install -y postfix mailutils
# choisissez "Internet Site" (ou "Satellite" pour relayer via un smarthost)
2. Définissez MAILTO
Cron envoie la sortie au propriétaire de la crontab sauf indication contraire. Définissez une vraie adresse en haut de la crontab :
MAILTO="ops@example.com"
0 2 * * * /opt/app/run.sh
Pas de sortie signifie pas d’e-mail — cron n’envoie que lorsqu’une tâche écrit sur stdout/stderr.
3. Votre courrier est rejeté comme spam
Même avec un MTA, le courrier envoyé directement depuis une IP de VPS quelconque a de fortes chances d’être rejeté ou classé indésirable : pas de SPF, pas de DKIM, pas de DNS inverse, et l’IP peut figurer sur une liste de blocage. Relayer via un vrai fournisseur (smarthost / relais SMTP) corrige la délivrabilité, mais c’est un vrai travail à mettre en place et à maintenir.
4. Testez le chemin de bout en bout
echo "test body" | mail -s "cron mail test" ops@example.com
tail -f /var/log/mail.log
Si le journal indique le message différé (deferred) ou rejeté (bounced), c’est un problème de délivrabilité, pas de cron.
Une approche plus fiable que l’e-mail de cron
L’e-mail de cron est fragile par conception : il ne se déclenche que sur sortie, dépend d’un MTA que vous devez exploiter, et atterrit dans le spam. Pire encore : si la tâche cesse complètement de tourner, il n’y a pas de sortie — donc pas d’e-mail, et vous n’entendez rien.
Inversez la logique : au lieu de vous envoyer un e-mail quand une tâche tourne, soyez alerté quand l’une ne tourne pas. Pingez un heartbeat en cas de succès et laissez un service surveiller le silence :
0 2 * * * /opt/app/run.sh && curl -fsS https://ping.steadycron.com/<votre-jeton-ping>
Si le ping manque ou est en retard, SteadyCron vous envoie un e-mail (ou un message Slack, ou vous appelle) — sans MTA local, sans tracas SPF/DKIM, et cela capture le cas que l’e-mail de cron n’a jamais pu : la tâche qui a cessé de se déclencher.