Allons du plus simple au plus complexe. Nous vérifierons d’abord si le composant est activé et si les droits existent, puis nous regarderons l’état de la file d’attente, et seulement ensuite nous passerons à SMTP, TLS et à la partie réseau.
Le composant Database Mail XPs est désactivéC’est le cas le plus évident. C’est précisément ce qui provoque le message indiquant que Database Mail XPs est désactivé. La solution est simple : activer le composant via
sp_configure, puis vérifier le résultat.
Le profil est introuvable ou inaccessible à l’utilisateur appelantSi le profil existe mais que le login appelant n’a pas les droits nécessaires,
sp_send_dbmail ne pourra pas l’utiliser. Il faut alors vérifier :
- si le profil existe ;
- s’il est public ou privé ;
- si l’utilisateur possède le rôle DatabaseMailUserRole dans msdb ;
- sous quelle identité le job SQL Agent ou la procédure s’exécute réellement.
C’est souvent le dernier point qui est décisif. Tout fonctionne manuellement sous un compte administrateur, mais plus dans le job.
L’e-mail est mis en file d’attente, mais n’est pas envoyéC’est déjà une situation plus intéressante. Il faut alors examiner :
- l’état de Database Mail ;
- la file d’attente dans sysmail_allitems ;
- le journal sysmail_event_log ;
- si Service Broker est activé dans msdb ;
- si la file d’attente de messagerie n’est pas arrêtée.
Vous pouvez vérifier l’état ainsi :
EXEC msdb.dbo.sysmail_help_status_sp;Si Database Mail est arrêté, vous pouvez le démarrer :
EXEC msdb.dbo.sysmail_start_sp;Vérifier Service Broker dans msdb :
SELECT name, is_broker_enabledFROM sys.databasesWHERE name = N'msdb';Si
is_broker_enabled = 0, il s’agit déjà d’un problème administratif distinct. Il faut le corriger avec prudence, généralement pendant une fenêtre de maintenance de la base de données.
Erreurs SMTP, d’authentification et TLSIci, il faut regarder la description de l’erreur dans
sysmail_event_log. C’est généralement là que l’on voit ce qui s’est passé : login ou mot de passe incorrect, refus de relais, erreur de handshake TLS, impossibilité de se connecter à l’hôte ou timeout.
Erreurs liées aux pièces jointesSi vous joignez un fichier via
@file_attachments, SQL Server doit y avoir réellement accès au niveau du système de fichiers. Et ici, le contexte important est celui du service SQL Server, pas celui de la session interactive de l’administrateur. Lorsqu’un fichier « existe » localement mais que Database Mail ne le voit pas, le problème vient généralement des droits d’accès ou du chemin.
TLS 1.2 et restrictions de sécurité modernesC’est la partie que les anciennes instructions décrivent souvent de manière trop simplifiée. Un serveur SMTP moderne exige généralement non pas simplement « un chiffrement quelconque », mais une prise en charge TLS précise, une version compatible de .NET et des paramètres système Windows corrects.
Si le serveur SMTP attend TLS 1.2, il est utile de vérifier les points suivants :
- les mises à jour Windows et SQL Server sont à jour ;
- la prise en charge de TLS 1.2 est disponible sur le serveur ;
- .NET Framework et les paramètres crypto du système ne bloquent pas le handshake nécessaire ;
- la connexion sécurisée est activée dans les paramètres Database Mail.
Un exemple typique de paramètres de registre pour activer strong crypto ressemble à ceci :
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\v4.0.30319]"SchUseStrongCrypto"=dword:00000001[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v4.0.30319]"SchUseStrongCrypto"=dword:00000001[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]"DisabledByDefault"=dword:00000000"Enabled"=dword:00000001[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]"DisabledByDefault"=dword:00000000"Enabled"=dword:00000001Après modification de ces paramètres, un redémarrage du service SQL Server est généralement nécessaire, et parfois même un redémarrage complet du serveur, afin que Schannel et .NET prennent bien en compte les nouveaux paramètres.
Il y a ici trois nuances pratiques.
Premièrement, pour Database Mail, il est généralement préférable de viser le port 587 avec TLS/STARTTLS. Le port 465 est souvent mentionné dans les anciennes instructions comme une option, mais en pratique il se révèle fréquemment problématique, car Database Mail s’appuie sur la pile SMTP de .NET et fonctionne mieux dans un scénario STARTTLS que dans un scénario SMTPS implicite.
Deuxièmement, si vous utilisez Microsoft 365 ou un autre service de messagerie cloud moderne, vérifiez non seulement TLS, mais aussi le modèle d’authentification. Database Mail ne prend pas en charge les flux OAuth modernes. Si le fournisseur a désactivé l’authentification SMTP classique, l’e-mail ne partira pas, même avec un T-SQL correct. Dans ce cas, on utilise généralement soit un relais SMTP dédié, soit une boîte aux lettres pour laquelle SMTP AUTH est autorisé par la politique de l’organisation.
Troisièmement, la case SSL dans l’assistant SSMS signifie en pratique que le serveur doit prendre en charge un scénario SMTP-over-TLS correct. Il faut donc regarder non seulement l’interface, mais aussi la compatibilité réelle entre votre endpoint SMTP et Database Mail.
Limitations et pièges- sp_send_dbmail confirme la mise en file d’attente du message, pas sa livraison dans la boîte de réception de l’utilisateur.
- Database Mail dépend de l’infrastructure SMTP, de l’accessibilité réseau, du DNS, de la politique TLS et des règles d’authentification en dehors de SQL Server.
- Il ne prend pas en charge les scénarios OAuth modernes pour la messagerie cloud ; tous les services de messagerie d’entreprise ne fonctionneront donc pas sans relais ou configuration spécifique.
- Pour les pièces jointes, les droits importants sont ceux du compte de service SQL Server, pas ceux du compte administrateur sous lequel vous avez ouvert SSMS.
- La taille des pièces jointes et la liste des extensions interdites sont limitées par les paramètres de Database Mail et peuvent bloquer de manière inattendue certains scénarios pourtant fonctionnels.
- Database Mail est disponible dans SQL Server Database Engine et Azure SQL Managed Instance, mais pas dans Azure SQL Database ni dans les elastic pools.
ConclusionEn résumé, Database Mail convient surtout aux notifications de service, aux rapports planifiés et aux envois techniques. Je ne l’utiliserais pas pour une intégration e-mail complexe avec logique métier, templating et scénarios modernes d’authentification cloud. Dans ces cas-là, il cesse très vite d’être pratique.
Liens utiles