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.