我想找到当我在 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
我已经配置了数据库邮件,系统参数如下:
我的数据库邮件配置文件是公开的并设置为默认配置文件。我还设置了现有的个人资料。
这是执行一切并开始发送邮件的 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:\NAVDW\ECNAV.csv', @profile_name = 'DBMail'
FETCH NEXT FROM port_cursor
INTO @fldEmail, @fldSubject, @fldMessage
END
CLOSE port_cursor
DEALLOCATE port_cursor
所以问题仍然存在。有没有办法让我调整设置以更快地发送电子邮件?另外,真正的问题是,为什么有时发送电子邮件时会出现错误?发送到的电子邮件地址没有任何问题。我应该在哪里查找代码或数据库邮件配置中可能存在的错误?你有经历过这样的事情吗
msdb.dbo.sysmail_mailitems 表中的错误描述是什么?我的意思是,向外部域报告了错误,但邮件已送达。或者如果邮件未送达,我应该在哪里查看导致问题的原因。
您可以尝试在 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:\NAVDW\ECNAV.csv', @profile_name = 'DBMail'
FETCH NEXT FROM port_cursor
INTO @fldEmail, @fldSubject, @fldMessage
END
CLOSE port_cursor
DEALLOCATE port_cursor
虽然这会减慢执行速度,但添加此函数将为 SQL Server 提供足够的时间来使用游标有效地填充数据并发送电子邮件。在我的情况下它运行得非常好。