在 SQL Server 2008 中使用 sp_send_dbmail 传递的邮件很少
Posted
技术标签:
【中文标题】在 SQL Server 2008 中使用 sp_send_dbmail 传递的邮件很少【英文标题】:Only few mails getting delivered using sp_send_dbmail in SQL Server 2008 【发布时间】:2014-08-09 14:57:11 【问题描述】:我正在从表中的列中提取收件人列表,并且正在运行存储过程 sp_send_dbmail
以将电子邮件发送给这些收件人。
总共有大约 200 个收件人。
具有讽刺意味的是,即使我收到的邮件是邮件排队,但只有少数邮件被送达。数据库邮件配置正确,我正在使用Public
数据库配置文件。
当我检查msdb.dbo.sysmail_mailitems
表时,sent_status
列中的预期值对于接收邮件的收件人来说是 1,而对于其他收件人来说,该值是 0 或 2。
我完全确定收件人列表是 100% 正确的。我们有任何解决方法来解决这个问题吗?
下面是我正在运行的代码:
CREATE procedure [dbo].[sp_dataRefreshNotification]
AS
BEGIN
DECLARE @ToMail VARCHAR(20)
DECLARE @Body1 VARCHAR(MAX) =
'Dear User,
Data has been refreshed.
Regards,
IT Support Team
Note: This is an auto generated e-mail, please do not reply this mail. '
SELECT DISTINCT RecipientAddress FROM dbo.RecipientAddressList
OPEN notification_cursor
FETCH NEXT FROM notification_cursor
INTO @ToMail
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC msdb.dbo.sp_send_dbmail
@profile_name ='aaaa',
@Recipients = @Tomail,
@Subject = 'Required Data',
@Body = @Body1
FETCH NEXT FROM notification_cursor
INTO @ToMail
END
CLOSE notification_cursor
DEALLOCATE notification_cursor
END
【问题讨论】:
你能展示一些你用来发送电子邮件的代码吗? @M.Ali:我已经在我的问题中添加了代码。 运行 SQL Server Management Studio 并查看数据库邮件组件的日志 - 您拥有有关发送邮件的实际问题的所有信息。让我们知道那里有什么错误。 【参考方案1】:使用等待延迟功能,该功能会破坏光标的每个实例。
CREATE procedure [dbo].[sp_dataRefreshNotification]
AS
BEGIN
DECLARE @ToMail VARCHAR(20)
DECLARE @Body1 VARCHAR(MAX) =
'Dear User,
Data has been refreshed.
Regards,
IT Support Team
Note: This is an auto generated e-mail, please do not reply this mail. '
SELECT DISTINCT RecipientAddress FROM dbo.RecipientAddressList
OPEN notification_cursor
FETCH NEXT FROM notification_cursor
INTO @ToMail
WHILE @@FETCH_STATUS = 0
BEGIN
Waitfor Delay '000:00:10'
EXEC msdb.dbo.sp_send_dbmail
@profile_name ='aaaa',
@Recipients = @Tomail,
@Subject = 'Required Data',
@Body = @Body1
FETCH NEXT FROM notification_cursor
INTO @ToMail
END
CLOSE notification_cursor
DEALLOCATE notification_cursor
END
【讨论】:
【参考方案2】:你在这里不需要光标,同样的事情可以使用一个简单的选择查询来完成,见下文
CREATE PROCEDURE [dbo].[sp_dataRefreshNotification]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ToMail VARCHAR(MAX);
DECLARE @Body1 VARCHAR(MAX);
SET @Body1 = 'Dear User, ' + CHAR(10) +
'Data has been refreshed. ' + CHAR(10) +
'Regards, ' + CHAR(10) +
'IT Support Team ' + CHAR(10) + CHAR(10) +
'Note: This is an auto generated e-mail, please do not reply this mail. ' + CHAR(10)
SELECT @ToMail = COALESCE(@ToMail+';' ,'') + RecipientAddress
FROM (SELECT DISTINCT RecipientAddress
FROM dbo.RecipientAddressList) t
EXEC msdb.dbo.sp_send_dbmail @profile_name ='aaaa'
,@Recipients = @Tomail
,@Subject = 'Required Data'
,@Body = @Body1
END
【讨论】:
遵循此方法将为每个收件人提供完整的收件人列表,由于隐私限制,我不想这样做。 其余的程序对我来说似乎没问题。一个非常重要的问题,您确定没有电子邮件长度超过 20 个字符吗????您的电子邮件变量的 VARCHAR(20) 引起了怀疑。 是的,我对此很确定。我多次检查收件人列表,在意识到最大长度约为 17-18 个字符后,我使用 20 更安全。【参考方案3】:如果您确实需要向每个人发送一封单独的电子邮件,那么您的方法很适合使用循环和循环中的 WAITFOR DELAY '00:00:10'。但是,如果您可以向所有个人发送一封电子邮件,那么您可以连接这些电子邮件。收件人框中最多只能有 255 个串联的电子邮件字符。因此,您必须将生成的字符串分成几部分或少于 255 个字符。
【讨论】:
以上是关于在 SQL Server 2008 中使用 sp_send_dbmail 传递的邮件很少的主要内容,如果未能解决你的问题,请参考以下文章
无法解决排序规则冲突 - SQL Server 2008 R2 SP1
在 SQL Server 2008 中使用 sp_send_dbmail 传递的邮件很少
Windows Server 2003 standart edition SP2 上安装SQL Server 2008 开发版 英文版 教程