Проверка Если успешно выполнен sp_send_dbmail

Я ищу способ проверить, будут ли в конечном итоге sp_send_dbmail очереди электронной почты с помощью sp_send_dbmail отправлены с нашего сервера Exchange. Я просмотрел системные таблицы msdb.dbo.sysmail_mailitems и msdb.dbo.sysmail_log. msdb.dbo.sysmail_log кажется более полезным из двух; в частности, колонку description. Из тестов, которые я провел до сих пор, кажется, что всякий раз, когда возникает ошибка, в колонке description появляется сообщение в следующем формате:

Не удалось отправить почту получателям из-за сбоя почтового сервера. (Отправка почты с использованием учетной записи 3 (2012-11-01T11: 28: 04) Сообщение об исключении: не удается отправить почту на почтовый сервер (почтовый ящик недоступен. Ответ сервера: 5.7.1 Не удалось передать для [email protected]).)

Это связано с другими строками, которые имеют один и тот же process_id. Описание прилагаемых записей

Процесс DatabaseMail запущен

а также

Процесс DatabaseMail закрывается

Если сообщение электронной почты было успешно отправлено, в таблице записаны те же 2 строки, за исключением того, что между ними нет закрытых строк.

Поэтому, если у меня есть успешная отправка, в таблице появляется следующее:

enter image description here

и если у меня есть отказ отправки, журнал регистрирует это

enter image description here

Существуют ли другие экземпляры того, как записи могут регистрироваться, если сбой отправки или успешная передача? Например, возможно ли, что есть 4 строки записей для отправки (2 прилагается, когда он был запущен и когда он закрывается, и 2 заключенных, в которых сообщение электронной почты было успешно отправлено). Я не нашел записей журналов, которые отличались от приведенного выше шаблона, но хотелось бы убедиться, прежде чем писать логику на основе этого предположения.

Ответ 2

sysmail_faileditems выведет список sysmail_faileditems писем. Если вам нужно просмотреть список успешных электронных писем, вам нужно использовать sysmail_mailitems.

Используйте приведенный ниже запрос, чтобы получить подробную информацию для всех отправленных электронной почты той же даты:

SELECT * FROM msdb..sysmail_mailitems WHERE sent_date > DATEADD(DAY, -1,GETDATE())

И вот полный запрос на получение всех неудачных писем за последние 24 часа:

SELECT items.subject ,
       items.recipients ,
       items.copy_recipients ,
       items.blind_copy_recipients ,
       items.last_mod_date ,
       l.description
FROM   msdb.dbo.sysmail_faileditems AS items
       LEFT OUTER JOIN msdb.dbo.sysmail_event_log AS l 
                    ON items.mailitem_id = l.mailitem_id
WHERE  items.last_mod_date > DATEADD(DAY, -1,GETDATE())