我正在使用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表中提供的所有失败的电子邮件。
如何重新发送所有失败的电子邮件?
答案 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';
答案 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,否则,它们不会从未发送视图中删除,我最终在意识到之前已发送了每封电子邮件的多个副本并杀死了脚本。