Sql server 2005 在SQL Server 2005上,只有部分电子邮件从sp_send_dbmail(数据库邮件)成功发送
我想找到在SQLServer2005上使用Sql server 2005 在SQL Server 2005上,只有部分电子邮件从sp_send_dbmail(数据库邮件)成功发送,sql-server-2005,sp-send-dbmail,database-mail,Sql Server 2005,Sp Send Dbmail,Database Mail,我想找到在SQLServer2005上使用sp\u send\u dbmail时发生的情况的答案。我一直在谷歌搜索,但没有成功,我真的不知道现在该去哪里 这是一个场景: 我已经在SQL server上设置了邮件功能。我在一个表中有电子邮件地址,在另一个表中有内容。对于我在表中找到的每个地址,我使用sp\u send\u dbmail存储过程编译一条新消息到该地址 当我稍后执行自己的SP执行上述操作时(接收电子邮件并向收件人编译新邮件),DatabaseMail90.exe将在服务器上启动,并发送
sp\u send\u dbmail
时发生的情况的答案。我一直在谷歌搜索,但没有成功,我真的不知道现在该去哪里
这是一个场景:
我已经在SQL server上设置了邮件功能。我在一个表中有电子邮件地址,在另一个表中有内容。对于我在表中找到的每个地址,我使用sp\u send\u dbmail
存储过程编译一条新消息到该地址
当我稍后执行自己的SP执行上述操作时(接收电子邮件并向收件人编译新邮件),DatabaseMail90.exe将在服务器上启动,并发送电子邮件。但这就是问题的症结所在,因为有些邮件是直接分发的,可能是因为它们位于同一个域和网络上。复杂的是,大多数(并非所有)外部邮件在msdb.dbo.sysmail_mailtimes表中都会出现错误。但困惑并不止于此。尽管msdb.dbo.sysmail_mailtimes表中报告了错误,但仍有一些电子邮件正在发送
这是我用来查看已发送邮件状态的查询:
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
- 日志记录级别:扩展
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_mailtimes表中的错误描述是什么?我的意思是,有一个错误报告给一个外部域,但邮件被传递。或者如果邮件未送达,我应该在哪里查找问题的原因。您可以根据以下要求在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有足够的时间使用游标高效地填充数据并发送电子邮件。在我的情况下,它运行得非常好。有最终的解决方案吗?