Хранимая процедура с использованием SP_SEND_DBMAIL отправки дубликатов электронных писем всем получателям
У меня есть хранимая процедура, которая выполняется каждую ночь, которая должна отправлять результаты запроса нескольким получателям. Однако в большинстве дней отправка дубликата электронной почты заканчивается через минуту. Я использую следующий код (все электронные письма и ссылки на базы данных были изменены):
EXEC msdb.dbo.sp_send_dbmail
@recipients = 'email1@email.com',
@copy_recipients = 'email2@email.com;email3@email.com;email4@email.com',
@subject = 'Example Email',
@profile_name = 'ExampleProfile',
@query = 'SELECT name
FROM table
WHERE date BETWEEN (getdate() - 1) AND getdate()',
@attach_query_result_as_file = 1
Любая помощь с этим будет принята с благодарностью.
8 ответов
Решение оказалось сократить число учетных записей повторных попыток учетной записи на сервере до 0 (в мастере настройки базы данных почты).
Это происходит потому, что адрес, получающий электронное письмо (либо в группе, либо в отдельности), имеет недействительный адрес электронной почты. Хотя вы можете исключить повторные попытки, как в принятом ответе, лучший способ - очистить дистрибутив.
У меня была похожая проблема, когда у нас было несколько получателей в одном письме, и оно генерировало 2 отправленных письма. В результате возникла проблема с тем, что один из получателей больше не действителен, и при повторной попытке будет отправлено электронное письмо всем получателям, а не только тому, который не удался. Есть несколько просмотров в msdb, которые могут помочь вам найти вашего недопустимого получателя. Они запускают dbo.sysmail_<что-то>
Есть несколько решений этой проблемы.
- Выделите каждого получателя как отдельное письмо.
- Удалить недействительного получателя из списка
- Установите для параметра повтора в DBMail значение 0
У меня была такая же проблема дублирования при использовании оператора SELECT в @query для отправки постоянного текста в теле каждого электронного письма, в дополнение к использованию @body и @subject для отправки настраиваемого текста в зависимости от некоторых условий.
Как и ожидалось, одно письмо содержало как пользовательский текст, так и текст запроса. Дублированный адрес электронной почты содержал только текст @query (без пользовательского текста) с вставленной в систему строкой темы "Сообщение SQL Server".
Я запустил SELECT * FROM msdb.dbo.sysmail_sentitems и убедился, что достаточно электронной почты отправлялось дважды. Просмотр sysmail_configuration показал, что AccountRetryAttempts paramValue = 1.
Проблема исчезла после того, как я полностью удалил @query из хранимой процедуры (выполнил изменение), запустил sp. Затем я поместил @query обратно в sp, exec изменения. После этого письма начали отправлять только один раз. Пойди разберись.
Убедитесь, что у вас нет других операторов Update в каких-либо других триггерах в боковых триггерах при обновлении.
Даже когда я сталкивался с подобной проблемой, когда я перепроверял свои триггеры, я видел, что я использовал другой оператор Update в своем другом триггере. Это вызвало многократную стрельбу по триггерам. Следовательно две почты были вызваны.
Я бы посоветовал вам добавить еще одну таблицу в вашу базу данных, в которой будет храниться информация о том, когда в последний раз отправлялось электронное письмо каждому получателю.
Без такой таблицы вы не можете точно знать, что происходит. Что делать, если вы запускаете SP несколько раз случайно? Нет ничего, что помешало бы ему отправить электронное письмо.
По поводу этой проблемы - ваш почтовый сервер хранит копию в отправленных элементах? Если это так, вы можете проверить дату отправки для всех сообщений там. Это может дать вам хорошую информацию о том, что происходит.
Если он отправляет дубликаты электронных писем получателям, это означает, что ваш SP вызывается несколько раз в день. Проверьте время вызова, установленное в вашем задании SQL, которое вызывает этот SP. Это должно быть один раз в день, чтобы избежать дублирования электронных писем.
Если он не отправляется дважды с SQL Server и не является проблемой почтового сервера, убедитесь, что вы не проверяете почту в Outlook с фильтрами для почты, тогда вы можете получить письмо дважды.