在 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 r2 sp1 怎么看版本

在 SQL Server 2008 中使用 sp_send_dbmail 传递的邮件很少

Windows Server 2003 standart edition SP2 上安装SQL Server 2008 开发版 英文版 教程

sql server 2008,SP_OACreate手动执行成功,代理作业定时执行失败?

SQL Server 2008 R2升级到SQL Server 2012 SP1