Envoyez des email depuis docker avec OVH SMTP
OVH SMTP depuis Docker : emails envoyés mais jamais reçus — cause et solution
Le problème : les logs disent ✅, le destinataire ne reçoit rien
Lors de l’envoi d’emails via OVH SMTP depuis un conteneur Docker, il arrive que les messages semblent partir correctement — aucune exception Python, aucun code d’erreur SMTP — mais n’arrivent jamais à destination. Pas de bounce, pas de message d’erreur, rien dans les spams : le silence total.
Ce comportement est particulièrement difficile à diagnostiquer, car le serveur SMTP OVH accepte la connexion et le message sans se plaindre. Le problème est pourtant bien réel et reproductible.
La cause : le header From contient des caractères spéciaux
OVH rejette silencieusement les emails dont le champ From contient des caractères non-ASCII : tirets longs (—), accents, apostrophes typographiques, ou tout autre caractère hors de la plage ASCII standard.
Exemple de header problématique :
# ❌ À éviter absolument
msg["From"] = f"Toni — Société s.à r.l. <toni@email.lu>"
Ce type de valeur est légal selon RFC 5322 si correctement encodé, mais OVH ne l’accepte pas en pratique sur son infrastructure SMTP. Le rejet est silencieux : le serveur répond 250 OK mais le message est abandonné en aval.
La solution : un champ From simple, sans caractères spéciaux
Il suffit de remplacer le nom d’affichage par une chaîne ASCII pure :
# ✅ Correct
msg["From"] = f"Nom Societe Support <toni@email.lu>"
Pas d’accent, pas de tiret long, pas d’apostrophe typographique. Un nom simple, une adresse entre chevrons — c’est tout ce qu’OVH accepte de façon fiable.
Configuration SMTP OVH complète pour Docker (Python)
Voici la configuration minimale et fonctionnelle pour envoyer un email via OVH depuis un script Python dans un conteneur Docker :
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from_addr = "toni@email.lu"
to_addr = "destinataire@example.com"
password = "mot_de_passe_smtp"
msg = MIMEMultipart()
msg["From"] = f"Nom Societe Support <{from_addr}>" # ✅ ASCII uniquement
msg["To"] = to_addr
msg["Subject"] = "Sujet de l'email"
msg.attach(MIMEText("Corps du message.", "plain"))
with smtplib.SMTP_SSL("ssl0.ovh.net", 465) as server:
server.login(from_addr, password)
server.sendmail(from_addr, to_addr, msg.as_string())
Points clés de cette configuration
| Paramètre | Valeur correcte | Erreur fréquente |
|---|---|---|
| Hôte SMTP | ssl0.ovh.net | smtp.ovh.net (peut varier) |
| Port | 465 | 587 avec STARTTLS (fonctionne parfois, pas toujours) |
| Chiffrement | SSL direct (SMTP_SSL) | STARTTLS — à éviter avec OVH |
Champ From | ASCII pur | Caractères spéciaux → rejet silencieux |
Pourquoi SMTP_SSL sur le port 465 et pas STARTTLS sur 587 ?
OVH recommande le port 465 avec SSL direct pour ses serveurs mutualisés. Le port 587 avec STARTTLS est supporté mais peut présenter des comportements instables selon la configuration du conteneur (résolution DNS, timeout, etc.). En environnement Docker, SMTP_SSL sur 465 est la méthode la plus fiable et la plus simple à déboguer.
En résumé
Si des emails envoyés depuis Docker via OVH n’arrivent pas à destination malgré un log sans erreur, la première chose à vérifier est le champ From. Un seul caractère spécial suffit à provoquer un rejet silencieux côté OVH. La correction est immédiate : remplacer le nom d’affichage par une chaîne ASCII simple.