Хранимая процедура с использованием SP_SEND_DBMAIL для отправки повторяющихся писем всем получателям

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

EXEC msdb.dbo.sp_send_dbmail
@recipients = '[email protected]',
@copy_recipients = '[email protected];[email protected];[email protected]',
@subject = 'Example Email',
@profile_name = 'ExampleProfile',
@query = 'SELECT name
    FROM table
    WHERE date BETWEEN (getdate() - 1) AND getdate()',
@attach_query_result_as_file = 1

Любая помощь в этом будет принята с благодарностью.


person andewM    schedule 20.03.2013    source источник
comment
Звонок кажется хорошим, но как вы его называете? Вы уверены, что не звоните два раза?   -  person il_guru    schedule 20.03.2013
comment
Я вызываю его через диспетчер заданий в агенте SQL Server, и, насколько я вижу, он вызывается только один раз в планировщике заданий.   -  person andewM    schedule 20.03.2013
comment
Вы проверили журнал?   -  person il_guru    schedule 20.03.2013
comment
Я только что проверил журнал, и задание запускается только один раз в день, и в каждом задании я вижу, что процедура запускается только один раз.   -  person andewM    schedule 20.03.2013
comment
Запустите SELECT * FROM msdb.dbo.sysmail_sentitems, отображаются ли две строки для рассматриваемого электронного письма? Если нет, то это проблема почтового сервера. Если да, то хранимая процедура вызывается дважды.   -  person twoleggedhorse    schedule 20.03.2013
comment
Также попробуйте SELECT * FROM dbo.sysmail_event_log для возможных ошибок, из-за которых SQL пытается отправить дважды.   -  person twoleggedhorse    schedule 20.03.2013
comment
@twoleggedhorse Я выполнил оба предоставленных вами запроса. Я обнаружил, что было отправлено только одно электронное письмо и не было ошибок, связанных с mailitem_id. Мне нужно будет проверить почтовый сервер и посмотреть, встречаются ли там дубликаты. Если я узнаю, почему это происходит, я опубликую ответ здесь.   -  person andewM    schedule 20.03.2013
comment
Ради интереса, кто-нибудь из этих получателей указан дважды? Возможно, один раз как [email protected], а затем снова в списке рассылки? Я слышал об ошибке обмена, которая в этом случае отправляет дважды. У вас есть ActiveSync на сервере Exchange 2003, который имеет известную ошибку, если SP2 не установлен?   -  person twoleggedhorse    schedule 20.03.2013
comment
Мы не используем никаких списков рассылки, и я позаботился о том, чтобы все адреса электронной почты были перечислены только один раз. Связавшись с ребятами, которые управляют нашим почтовым сервером, я попытался отключить задание, чтобы узнать, не вызывается ли SP откуда-то еще, однако я обнаружил, что это не так, поэтому в итоге я воссоздал задание, чтобы посмотреть, исправит ли оно проблему. проблема. Кажется, он сделал свое дело. Однако я буду следить за ним до конца недели и прослежу, чтобы он был отправлен только один раз.   -  person andewM    schedule 27.03.2013


Ответы (8)


Решением оказалось уменьшение количества учетных записей повторной попытки учетной записи на сервере до 0 (в мастере настройки почты базы данных).

person andewM    schedule 26.04.2013

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

person Ken Clark    schedule 20.03.2013
comment
Спасибо за ответ, но я проверил список заданий и уверен, что процедура выполняется только один раз. - person andewM; 20.03.2013

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

person Nilesh Thakkar    schedule 20.03.2013
comment
Спасибо за вклад, но я проверил и не использую никаких фильтров Outlook Mail. - person andewM; 27.03.2013

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

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

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

person Igor Voplov    schedule 22.03.2013
comment
Спасибо за ваш вклад. Я отключил задание, чтобы увидеть, выполнялась ли процедура в другом месте, однако обнаружил, что это не так, и в итоге заново создал задание, чтобы посмотреть, устранит ли оно проблему. Кажется, он сделал свое дело. - person andewM; 27.03.2013
comment
Я рад узнать, что помог :) - person Igor Voplov; 28.03.2013

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

person Eric Higgins    schedule 24.09.2014

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

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

  1. Выделите каждого получателя как отдельное электронное письмо.
  2. Удалить недействительного получателя из списка
  3. Установите для параметра повторной попытки в DBMail значение 0.
person Hugh McDaid    schedule 16.12.2014

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

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

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

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

person Doreen    schedule 11.01.2017

Убедитесь, что у вас нет других операторов обновления в каких-либо других триггерах в побочных триггерах при обновлении.

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

person Tinku Analytics    schedule 11.08.2017