-- Étape 3. Droits d’accès
USE msdb;
GO
ALTER ROLE DatabaseMailUserRole ADD MEMBER [PlamarJobUser];
GO
-- Étape 4. Envoi de tests
DECLARE @mailitem_id INT;
EXEC msdb.dbo.sp_send_dbmail
@profile_name = N'OperationsProfile',
@recipients = N'recipient@example.com',
@subject = N'SQL Server Notification',
@body = N'<h1>Database Mail works</h1><p>This is a test email from SQL Server.</p>',
@body_format = 'HTML',
@mailitem_id = @mailitem_id OUTPUT;
SELECT @mailitem_id AS mailitem_id;
Si vous avez besoin non pas simplement d’un e-mail texte, mais par exemple du résultat d’une requête SQL, sp_send_dbmail sait aussi le faire :
EXEC msdb.dbo.sp_send_dbmail
@profile_name = N'OperationsProfile',
@recipients = N'report@example.com',
@subject = N'Nightly SQL report',
@body = N'Le résultat de la requête nocturne est en pièce jointe.',
@query = N'SELECT TOP (10) Id, Status, CreatedAt FROM dbo.Orders ORDER BY CreatedAt DESC;',
@attach_query_result_as_file = 1,
@query_attachment_filename = N'orders.csv',
@query_result_separator = N';';
-- Requêtes de vérification
SELECT TOP (20)
mailitem_id,
sent_status,
send_request_date,
sent_date,
recipients,
subject
FROM msdb.dbo.sysmail_allitems
ORDER BY mailitem_id DESC;
Le journal Database Mail est également utile pour le diagnostic :
SELECT TOP (50)
log_date,
event_type,
description
FROM msdb.dbo.sysmail_event_log
ORDER BY log_date DESC;
Si vous vous intéressez précisément aux envois échoués, sysmail_faileditems est également pratique :
SELECT TOP (20)
mailitem_id,
subject,
recipients,
last_mod_date,
last_mod_user
FROM msdb.dbo.sysmail_faileditems
ORDER BY mailitem_id DESC;
-- Diagnostic file d’attente et Service Broker
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_enabled
FROM sys.databases
WHERE 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 TLS
Ici, 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 jointes
Si 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.
-- Exemple de configuration strong crypto / TLS 1.2
Windows Registry Editor Version 5.00
[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:00000001
Aprè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.