代码改变世界

SQL Server 2014 Database Mail重复发送邮件特殊案例

2016-10-31 12:02  潇湘隐者  阅读(2330)  评论(2编辑  收藏  举报

在一数据库服务器(Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64))发现有个作业调用Database Mail发送邮件时,有时候出现同样的邮件发送两封的情况,经过详细检查,排除了该作业里面业务逻辑有问题的情况,确实存在重复发送邮件的情况, 检查Database Mail日志,发现在0:00~0.03报“The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (2016-10-27T00:03:21). Exception Message: Cannot send mails to mail server”这类的错误,具体信息如下所示

clipboard

Date 2016/10/27 0:03:21

Log Database Mail (Database Mail Log)

Log ID 29022

Process ID 11300

Mail Item ID 747326

Last Modified 2016/10/27 0:03:21

Last Modified By sa

Message

The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (2016-10-27T00:03:21). Exception Message: Cannot send mails to mail server. (Mailbox unavailable. The server response was: 5.7.1 Unable to relay for zhouxxxx@xxxx.mail.onmicrosoft.com).

)

 

从上面日志可以看到是SMTP反馈zhouxxxx@xxxx.mail.onmicrosoft.com这个邮箱无法送达。Mail Item ID就可以查到相关,然后和开发人员一排查,就找到了发送邮件的存储过程,检查发现还是因为其中一个邮箱地址弄错了,导致这些错误出现在Database Mail日志中,当然如果遇到这类错误,必须查看Exception Message: Cannot send mails to mail server后面括号里面详细的报错信息,然后检查、分析确认(Mailbox unavailable. The server response was: 5.7.1 Unable to relay for zhouxxxx@xxxx.mail.onmicrosoft.com). 不同的日志信息,往往反馈不同的问题。也正是这种情况的邮件,都出现了重复发送情况。

 

手工测试这样的情形(发送给多个收件人,其中一个邮件名称故意写错),发现邮箱确实会收到两封这样的邮件。

EXEC msdb.dbo.sp_send_dbmail @subject='邮件重复发生问题测试——1',@recipients='xxxx@xxxx.microsoft.com;konglb@xxxx.com',@body='test the email send twice problem';

 

 

然后我想定位到底是SQL Server版本问题,还是SMTP设置问题,结果测试过程让我更迷惑了

 

1: 测试了SQL Server 2008配置了同样SMTP服务器的数据库,发现这种情况,邮件不会重复发送。那么可以排除SMTP的一些设置问题导致。

 

2: 测试了SQL Server 2014相同版本,相同SMTP配置的数据库,发现这种情况,居然不会发生邮件重复发送的情况。呐呢,让人懵了。也就是只有那台环境下才会出现这种情况,其它环境都无法重现。

 

3: 检查了Database Mail配置信息以及系统参数设置,基本一致,没有区别。也不应该是这个导致邮件重复发送问题。

 

4: 系统管理员帮忙检查了SMTP服务器的日志,发现重复发送的邮件除了下面Message ID不一样外,其它一样,但是检查msdb.dbo.sysmail_mailitems表里面记录,只有一条发送记录。如下截图所示

clipboard

 

网上也搜索了一下,没有看到类似的问题或bug信息。真是一个非常奇怪的问题,好在这个问题解决倒非常简单。 不过问题的诡异倒是让人摸不着头脑。

 

-------------------------------------------------------------------------分割线-------------------------------------------------------------------------

一网友反馈出现邮件重复发送的原因是因为Database Mail Configuration里面设置为1的缘故,测试了一下,在收件人列表输入一个错误邮箱,确实会收到两封邮件。这个问题解决了!

 

image