Wednesday, March 16, 2022

SQL Server Database Mail Failure Troubleshooting & Two Common Issues

This blog discusses troubleshooting steps to investigate the failure of SQL Server Database Mail service on sending email. It also discusses 2 special scenarios with SQL Server Database Mail that commonly cause mail sending failure

 

  • General Troubleshooting Steps to Narrow Down RCA
  • Special Scenarios:

    Scenario 1: Implicit SSL/TLS mode is not supported for SQL Server DB Mail. If your SMTP server requires implicit TLS, then SQL Server DB Mail will not be able to send email using this SMTP server. 

     

    Scenario 2: SQL DB Mail failure caused by SMTP mail server requesting TLS 1.2. In this case, TLS 1.2 needs to be enabled at DB Mail server.

 

Commonly Used Protocols and Port

========================

protocol

No encryption

TLS/SSL

TLS/SSL

Plain port

Explicit port

Implicit port

FTP

21

21

990

SMTP

25 or 587

25 or 587

465

IMAP

143

143

993

POP3

110

110

995

Telnet

23

23

992

HTTP

80

-

443

 

General Troubleshooting Steps to Narrow Down RCA

=====================================

 

  • Check SQL DB Mail errors from DMV and logs

 

/*List all DB Mail event log*/

 

SELECT * FROM msdb.dbo.sysmail_event_log ORDER BY log_date DESC

 

/*List all failed items */

SELECT er.log_id AS [LogID],

    er.event_type AS [EventType],

    er.log_date AS [LogDate],

    er.description AS [Description],

    er.process_id AS [ProcessID],

    er.mailitem_id AS [MailItemID],

    er.account_id AS [AccountID],

    er.last_mod_date AS [LastModifiedDate],

    er.last_mod_user AS [LastModifiedUser],

    fi.send_request_user,

    fi.send_request_date,

    fi.recipients, fi.subject, fi.body

FROM msdb.dbo.sysmail_event_log er

    LEFT JOIN msdb.dbo.sysmail_faileditems fi

ON er.mailitem_id = fi.mailitem_id

ORDER BY [LogDate] DESC

 

  • Check and ensure DB Mail has been enabled

 

sp_configure 'show advanced options', 1; 

GO 

RECONFIGURE; 

GO 

sp_configure 'Database Mail XPs', 1; 

GO 

RECONFIGURE 

GO

 

  • Check and ensure the SQL Server service account has permission to call the Database mail’s executable file (DatabaseMail.exe)

Example:

Install Path:\Program Files\Microsoft SQL Server\MSSQL1.SQL2019\MSSQL\Binn\DatabaseMail.exe

  • Check DB Mail account profile’s security configuration options and port number you have chosen for further troubleshooting purpose

 

  1. The Port Number you have chosen for this account
  2. Whether or not you have checked the box “this server requires a secure connection(SSL)”
  3. The type of SMTP authentication you have chosen

 

Steps: Open SSMS, select Management, right-click Database Mail, and select Configure Database Mail  -> Manage Database Mail accounts and profiles > Next.

 

 

  • Telnet Port and IP of SMTP Server. In SQL DB Mail server, telnet the SMTP server to see if SQL machine can communicate with the IP and port of your SMTP (the port number configured in your profile). Most SMTP servers use port 25. If the telnet is not successful, it means the network communication from DB Mail server to SMTP server has caused the problem. If the DB Mail server can communicate with other server without issue, then the problem lies on the network traffic with SMTP server

 

Open CMD as administrator and run below command to telnet your target server IP and port

telnet [domain name or ip] [port]

For example, to verify connection to 192.168.0.10 on port 25, issue the command:

telnet 192.168.0.10 25

 

Configure TELNET in your server:

Windows 7, 8. 10:

Open Windows Start menu > Type "Control Panel" > Press Enter > “Programs” > "Programs and Features" > Turn Windows features on or off > Select "Telnet Client" > Press “OK"

Windows Server 2012, 2016:

 

Open “Server Manager” > “Add roles and features” > click “Next” until reaching the “Features” step > tick “Telnet Client” > click “Install” > when the feature installation finishes, click “Close”.

 

  • Run Testing Script to Send email. If telnet to the IP and port from DB Mail server to SMTP server is successful, it means the network from DB server to SMTP server is good. We will need to test and see if we can send DB Mail via PowerShell or other scripts (rule out impact of DB Mail service and see if we could directly send email to your SMTP server to isolate the issue further). Also, we suggest to test and see if we can switch to a public SMTP server for the same DB Mail profile as well as switch to different DB Mail profile to narrow down whether it is profiler issue, SMTP server issue, or SQL Server DB Mail service issue.

 

Below is a sample PowerShell Script to send DB mail

$UserCredential = Get-Credential
enter this:
user:test@chimex.onmicrosoft.com
password:yourpassword
Send-MailMessage -to "youremail" -from "test@chimex.onmicrosoft.com" -subject "powershell" -body "powershell" -BodyAsHtml -smtpserver smtp.office365.com -usessl -Credential $UserCredential

 

  • If step 6 is not able to be directly tested in your environment, kindly collect a network monitor trace when you reproduce the issue (failed to send DB Mail)

 

  • If you do not see clear evidence to find RCA in the network trace for client or SMTP server reset, based on the symptom, you may need to collect a TTT debug trace for dbmail.exe and work with Microsoft support.

 

 

Special Scenarios:

===============

  • Scenario 1:  Implicit TLS mode is not supported for SQL Server DB Mail. If your SMTP server requires implicit TLS, then SQL Server DB Mail will not be able to send email with this SMTP server. You can consider the options of switching to a different SMTP Server (such as a public one) that support STARTTLS or making modification in your SMTP server to support STARTTLS

 

If your DB Mail profile has enabled SSL encryption, then STARTTLS would be required in the secured communication between your DB Mail server and SMTP Server.

 

For SQL Server Database Mail architecture, as our service relies on .Net System.Net.Mail (SmtpClient class) and System.Net.Mail does not support “Implicit SSL/TLS“mode, SQL Server Database Mail does not support it as well. In the past, port 465 can be used to support “Implicit SSL/TLS“mode (SMTP over SSL). Now it is no longer supported.

(more details , kindly refer SmtpClient.EnableSsl Property (System.Net.Mail) | Microsoft Docs )

 

More Details with STARTTLS and “Implicit SSL/TLS”

---------------------------------------------------------------------

“STARTTLS” is an email protocol command that would turn an insecure network connection into a secured one. If email client server has enabled/request SSL or TLS encryption, then STARTTLS would be required for SQL Server DB Mail service to successfully send email.

 

“Implicit SSL/TLS” is another mode for secured client to server communication. The major two differences between “STARTTLS” and “Implicit SSL/TLS” are summarized as below (while there are a couple of other differences) :

  • With the “Implicit SSL/TLS” mode, email client server connects to the SMTP server and TLS/SSL encryption is switched on implicitly as soon as the connection is established while under “STARTTLS” mode, client explicitly requests TLS/SSL encryption to be switched on after initial TCP handshake.
  •  With “Implicit SSL/TLS” mode, if the connection is not able to be built with encrypted security mode, the email will be prevented from being sent. However, with “STARTTLS”, if the SMTP mail server not able to support TLS encryption as requested by email client server, the email client server will negotiate with the SMTP server and agree to downgrade to an unencrypted connection. Thus, with “STARTTLS”, you can use the same port for encrypted and plain text mail.

 

  • Scenario 2: SQL DB Mail failure caused by SMTP mail server requesting TLS 1.2. In this case, TLS 1.2 needs to be enabled at DB Mail server.

 

Multiple DB Mail cases have seen its failure being caused by client DB Mail server not supporting TLS 1.2 while the SMTP mail server is requesting TLS 1.2. Unfortunately, most often the error observed in Database Mail Log Viewer (sysmail_event_log) is very generic as below. From network monitor trace, you may not see any STARTTLS traffic as the connection can be reset by DB mail server after initial handshake.

The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 2 (2022-03-14T16:58:54). Exception Message: Cannot send mails to mail server. (Failure sending mail.).  )

 

If Schannel errors are detected in Windows system event logs around the same time when DB Mail failure happens, you are suggested to use below troubleshooting steps to see if the failure is related to TLS 1.2 requested by SMTP server.  

 

  • Use the first 7 steps mentioned earlier to narrow down other issues that can play a role in the scene.

 

  • Check system event log for any Schannel errors (or any errors) from the same time as the database mail failure occurred 

Below are a few examples but there could be others. Any Schannel error occurring at the same time as the database mail failure should be cautiously checked.

 

{timestamp},Error,{servername},36887,Schannel,A fatal alert was received from the remote endpoint. The TLS protocol defined fatal alert code is 70.

{timestamp},Error,0,36871,Schannel,{servername},A fatal error occurred while creating a TLS client credential. The internal error state is 10013.

 

 

 

  • Check registry settings in DB Mail server and make sure the needful ones are present. Reboot is needed for the change to take effects. (Please first take a backup of your registry key and store them in another machine before you make any change! )

 

 

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727] 

"SystemDefaultTlsVersions"=dword:00000001 

"SchUseStrongCrypto"=dword:00000001 

 

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319] 

"SystemDefaultTlsVersions"=dword:00000001 

"SchUseStrongCrypto"=dword:00000001 

 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727] 

"SystemDefaultTlsVersions"=dword:00000001 

"SchUseStrongCrypto"=dword:00000001 

 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319] 

"SystemDefaultTlsVersions"=dword:00000001 

"SchUseStrongCrypto"=dword:00000001 

 

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2] 

 

[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 

 

DISCLAIMER : THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

Posted at https://sl.advdat.com/3IfyeJ1https://sl.advdat.com/3IfyeJ1