只有一些电子邮件从 SQL Server 2005 上的 sp_send_dbmail(数据库邮件)成功发送

我想找到在 SQL Server 2005 上使用 sp_send_dbmail 时发生的事情的答案。我一直在谷歌搜索但没有成功,我现在真的不知道该去哪里。

这是场景:

我在我们的 SQL 服务器上设置了一个邮件功能。我在一个表中有电子邮件地址,在另一个表中有内容。对于我在表中找到的每个地址,我使用 sp_send_dbmail 存储过程将新消息编译到该地址。

当我稍后执行执行上述操作的自己的 SP 时(接收电子邮件并将新消息编译给收件人),DatabaseMail90.exe 在服务器上启动,并且正在发送电子邮件。但这就是棘手的地方,因为一些邮件是直接分发的,可能是因为它位于同一个域和网络上。复杂的是,大多数(不是全部)外部邮件在 msdb.dbo.sysmail_mailitems 表中出现错误。但混乱并不止于此。尽管在 msdb.dbo.sysmail_mailitems 表中报告了错误,但某些电子邮件仍在传递。

这是我用来查看已发送消息状态的查询:

SELECT
    mailitem_id,
    recipients,
    subject,
    send_request_date,
    sent_status, --0 new, not sent, 1 sent, 2 failure or 3 retry.
    sent_date
FROM 
    msdb.dbo.sysmail_mailitems
WHERE
    sent_status != 1

我已经配置了数据库邮件,系统参数如下:

  • 帐户重试次数:3
  • 帐户重试延迟(秒):30
    *最大文件大小(字节):50000000(永远不会这么大,但只是为了安全起见)
  • 禁止的附加文件扩展名:exe、dll、vbs、js
  • 数据库邮件可执行文件的最小生命周期(秒):300
    *记录级别:扩展

我的数据库邮件配置文件是公共的并设置为默认配置文件。我还建立了一个现有的个人资料。

这是执行一切并开始发送邮件的 SP:

DECLARE @fldEmail AS VARCHAR(max)
DECLARE @fldSubject AS VARCHAR(max)
DECLARE @fldMessage AS VARCHAR(max)
DECLARE port_cursor CURSOR FOR
SELECT d.[E-Mail],s.Subject,s.HTMLMessage
FROM tbl_NAV_Sendout s,tbl_NAV_DistributionList d
OPEN port_cursor
FETCH NEXT FROM port_cursor
INTO @fldEmail, @fldSubject, @fldMessage
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC msdb.dbo.sp_send_dbmail @recipients = @fldEmail, @subject = @fldSubject, @body = @fldMessage, @body_format = 'HTML', @file_attachments = 'C:NAVDWECNAV.csv', @profile_name = 'DBMail'
FETCH NEXT FROM port_cursor
INTO @fldEmail, @fldSubject, @fldMessage
END
CLOSE port_cursor
DEALLOCATE port_cursor

所以问题仍然存在。有没有办法让我调整设置以更快地发送电子邮件?而且,真正的问题是,为什么有时发送电子邮件时会出错?它发送到的电子邮件地址没有任何问题。我应该在哪里查找代码或数据库邮件配置中可能出现的错误?你有过这样的经历吗?

msdb.dbo.sysmail_mailitems 表中的错误描述是什么?我的意思是,向外部域报告了错误,但邮件已送达。或者如果邮件没有送达,我应该在哪里查看导致问题的原因。

stack overflow Only some e-mail gets sent successfully from sp_send_dbmail (Database Mail) on SQL Server 2005
原文答案

答案:

作者头像

您可以尝试在您的 sql 查询中添加 WAITFOR DELAY 函数,如下所示:

DECLARE @fldEmail AS VARCHAR(max)  
DECLARE @fldSubject AS VARCHAR(max)  
DECLARE @fldMessage AS VARCHAR(max)  
DECLARE port_cursor CURSOR FOR  
SELECT d.[E-Mail],s.Subject,s.HTMLMessage  
FROM tbl_NAV_Sendout s,tbl_NAV_DistributionList d  
OPEN port_cursor  
FETCH NEXT FROM port_cursor  
INTO @fldEmail, @fldSubject, @fldMessage  
WHILE @@FETCH_STATUS = 0  
BEGIN  
WAITFOR DELAY '000:00:10'  
EXEC msdb.dbo.sp_send_dbmail @recipients = @fldEmail, @subject = @fldSubject, @body =   @fldMessage, @body_format = 'HTML', @file_attachments = 'C:NAVDWECNAV.csv',   @profile_name = 'DBMail'  
FETCH NEXT FROM port_cursor  
INTO @fldEmail, @fldSubject, @fldMessage  
END  
CLOSE port_cursor  
DEALLOCATE port_cursor  

虽然这会减慢执行速度,但添加此函数将使 SQL Server 有足够的时间使用游标有效地填充数据并传递电子邮件。在我的情况下它工作得很好。