【问题标题】:Only few mails getting delivered using sp_send_dbmail in SQL Server 2008在 SQL Server 2008 中使用 sp_send_dbmail 传递的邮件很少
【发布时间】: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 并查看数据库邮件组件的日志 - 您拥有有关发送邮件的实际问题的所有信息。让我们知道那里有什么错误。

标签: sql sql-server sql-server-2008 tsql


【解决方案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 个字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多