首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Server 2008中使用sp_send_dbmail发送的邮件很少

在Server 2008中使用sp_send_dbmail发送的邮件很少
EN

Stack Overflow用户
提问于 2014-08-09 14:57:11
回答 3查看 1.1K关注 0票数 0

我正在从表格中的一列中提取收件人列表,并运行存储过程sp_send_dbmail将电子邮件发送给这些收件人。

共有约200名受助人。

具有讽刺意味的是,即使我得到的消息是邮件排队的,也只有很少的邮件被发送。数据库邮件是正确配置的,我正在使用Public数据库配置文件。

当我检查msdb.dbo.sysmail_mailitems表时,sent_status列中的期望值为1,对于被传递邮件的收件人,其他收件人的值为0或2。

我完全相信收件人名单是100%正确的。我们有什么办法解决这个问题吗?

下面是我正在运行的代码:

代码语言:javascript
运行
复制
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  
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-11 10:32:25

使用等待延迟函数,它将破坏光标的每个实例。

代码语言:javascript
运行
复制
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  
票数 1
EN

Stack Overflow用户

发布于 2014-08-09 17:36:22

这里不需要光标,使用简单的select查询也可以完成相同的任务,请参阅下面

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2022-02-09 10:32:44

如果你真的需要发送一个单独的电子邮件给每个人,那么你的方法是好的使用循环和WAITFOR延迟'00:00:10‘在循环中。但是如果你能给所有的人发一封电子邮件,那么你就可以把这些邮件连在一起。只有最多255个字符的串联电子邮件可以在收件人框中。因此,您必须将得到的字符串拆分为更少的255个字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25219812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档