Хранимая процедура с помощью 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 (в Мастере настройки Database Mail).


Если он отправляет повторяющиеся электронные письма получателям, это означает, что ваш SP вызывается несколько раз в день. Проверьте время вызова, установленное в задании SQL, которое вызывает этот SP. Следует раз в день, чтобы избежать дублирования сообщений.


Если он не отправляется дважды с SQL Server и не является проблемой почтового сервера, а затем убедитесь, что вы не проверяете почту в Outlook с фильтрами для почты, то вы можете получить письмо дважды.


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

без такой таблицы вы не можете действительно знать, что происходит. Что делать, если вы запускаете SP несколько раз случайно? Нет ничего, что помешает ему отправить электронное письмо.

относительно этой проблемы-ваш почтовый сервер хранит копию в отправленных элементах? Если это так, вы можете проверить дату отправки для всех сообщений там. Этот может дать вам хорошую информацию о том, что происходит.


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


У меня была аналогичная проблема, когда у нас было несколько получателей в одном письме, и он генерировал 2 отправленных письма. Проблема закончилась тем, что один из получателей больше не действителен, и повторная попытка отправит электронное письмо всем получателям, а не только тому, который не удался. В msdb есть несколько представлений, которые могут помочь вам найти недопустимого получателя. Они начинают dbo.sysmail_

есть несколько решений этой проблемы.

  1. выйти каждую получатель как отдельное письмо.
  2. удалить недопустимого получателя из списка
  3. установите параметр повтора в DBMail в 0

У меня была такая же проблема дублирования при использовании оператора SELECT в @query для отправки постоянного текста в теле каждого письма, в дополнение к использованию @body и @subject для отправки пользовательского текста в зависимости от некоторых условий.

одно письмо содержало как пользовательский текст, так и текст запроса, как ожидалось. Дублированное письмо содержало только текст @query (без пользовательского текста) с системной вставленной строкой темы "сообщение SQL Server".

Я запустил SELECT * FROM msdb.dbo.sysmail_sentitems и, конечно же, электронная почта была отправлена дважды. Посмотрите на sysmail_configuration показали, что AccountRetryAttempts paramValue = 1.

проблема ушла после того, как я полностью удалил @query из хранимой процедуры (выполнил изменение), запустил sp. Затем я вернул @query в sp, выполнив изменение. После этого письма начали отправлять только один раз. Иди разберись.


убедитесь, что у вас нет других инструкций Update в других триггерах в боковых триггерах при обновлении.

даже я столкнулся с подобной проблемой, когда я перекрестно проверил свои триггеры, я видел, что я использовал другой оператор обновления в своем другом триггере. Это вызвало многократную стрельбу по спусковым крючкам. Поэтому были запущены два письма.