如何重新发送所有失败的电子邮件(msdb.dbo.sp_send_dbmail)

时间:2017-07-25 10:17:32

标签: sql sql-server

我正在使用msdb.dbo.sp_send_dbmail发送电子邮件。 有时电子邮件不发送。我收到了失败的电子邮件列表。

SELECT TOP 10 * from msdb.dbo.sysmail_event_log 


log_id  event_type  log_date    process_id  mailitem_id account_id  last_mod_date   last_mod_user
9022    error   50:15.9 5608    20428   NULL    50:15.9 sa
9023    error   51:23.3 5608    20428   NULL    51:23.3 sa

现在,我想再次重新发送sysmail_event_log表中提供的所有失败的电子邮件。

如何重新发送所有失败的电子邮件?

3 个答案:

答案 0 :(得分:2)

使用以下查询发回失败的项目 或者对msdb.dbo.sysmail_faileditems中的每一行使用CURSOR并使用相同的查询

DECLARE @to        varchar(max)
DECLARE @copy    varchar(max)
DECLARE @title    nvarchar(255)
DECLARE @msg    nvarchar(max)
SELECT @to = recipients, @copy = copy_recipients, @title = [subject], @msg = body
FROM msdb.dbo.sysmail_faileditems
WHERE mailitem_id =  56299
EXEC msdb.dbo.sp_send_dbmail
@recipients = @to,
@copy_recipients = @copy,
@body = @msg,
@subject = @title,
@body_format = 'HTML';

参考

resending-failed-emails-through-sp_send_email
CURSOR

答案 1 :(得分:0)

从Hybris95的答案开始,这是一个片段,该片段在截止时间戳后没有光标的情况下发送所有失败的项目。邮件配置文件已考虑在内。

DECLARE @MailitemId INT = 0
DECLARE @Cutoff DATE = CAST(GETDATE() AS DATE)

WHILE (1 = 1) 
BEGIN  
    SELECT TOP 1 @MailitemId = mailitem_id 
    FROM msdb.dbo.sysmail_faileditems
    WHERE
        mailitem_id > @MailitemId
        AND send_request_date > @Cutoff

    IF @@ROWCOUNT = 0 BREAK;

    DECLARE @to VARCHAR(MAX)
    DECLARE @copy VARCHAR(MAX)
    DECLARE @title NVARCHAR(255)
    DECLARE @msg NVARCHAR(MAX)
    DECLARE @profile_name NVARCHAR(MAX),
        @file_attachments NVARCHAR(MAX),
        @attach_query_result_as_file BIT 

    SELECT @profile_name = p.name, @to = recipients, @copy = copy_recipients, @title = [subject], @msg = body, @file_attachments = i.file_attachments, @attach_query_result_as_file = i.attach_query_result_as_file
    FROM msdb.dbo.sysmail_faileditems AS i LEFT OUTER JOIN msdb.dbo.sysmail_profile AS p
    ON p.profile_id = i.profile_id
    WHERE
        mailitem_id = @MailitemId

    EXEC msdb.dbo.sp_send_dbmail
        @profile_name = @profile_name,
        @recipients = @to,
        @copy_recipients = @copy,
        @body = @msg,
        @subject = @title,
        @body_format = 'HTML',
        @file_attachments = @file_attachments,
        @attach_query_result_as_file = @attach_query_result_as_file

END

答案 2 :(得分:0)

警告那些打算从Mark Lopez运行脚本的人!我用它来纠正SMTP服务器宕机的一天。我将其从sysmail_faileditems更改为sysmail_unsentitems。请确保在msdb.dbo.sysmail_allitems中将send_status更新为1(已发送),并在调用sp_send_dbmail之后添加send_date,否则,它们不会从未发送视图中删除,我最终在意识到之前已发送了每封电子邮件的多个副本并杀死了脚本。