クエリの結果を複数の受信者に送信することになっている、毎晩実行されるストアドプロシージャがあります。ただし、ほとんどの場合、1分後に重複した電子メールを送信することになります。私が使用しているコードは次のとおりです(すべての電子メールとデータベース参照が変更されています):
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
これに関する助けをいただければ幸いです。
解決策は、サーバー上のアカウント再試行アカウントの数を0に減らすことであることが判明しました(データベースメール構成ウィザード内)。
SQL Serverから2回送信されておらず、Mail Serverの問題でもない場合は、メールのフィルターを使用してOutlookでメールをチェックしていないことを確認してください。そうすると、メールが2回届く可能性があります。
データベースに別のテーブルを追加して、各受信者に最後にメールが送信された日時に関する情報を保持することをお勧めします。
そのようなテーブルがなければ、何が起こっているのかを本当に知ることはできません。誤ってSPを複数回実行した場合はどうなりますか?電子メールの送信を妨げるものは何もありません。
この問題に関して–メールサーバーは送信済みアイテムのコピーを保持していますか?もしそうなら、そこにあるすべてのメッセージの送信日を確認したいかもしれません。これにより、何が起こっているかについての良い情報が得られる可能性があります。
受信者に重複するメールを送信している場合は、SPが1日に複数回呼び出されていることを意味します。このSPを呼び出しているSQLジョブで設定されている呼び出し時間を確認してください。メールの重複を避けるための1日。
@queryでSELECTステートメントを使用してすべての電子メールの本文に一定のテキストを送信しているときに同じ重複の問題が発生しました。また、@ bodyと@subjectを使用して、条件に応じてカスタムテキストを送信しました。
1つの電子メールには、期待どおりにカスタムテキストとクエリテキストの両方が含まれていました。複製された電子メールには、「SQL Serverメッセージ」という件名がシステムに挿入された@queryテキストのみが含まれていました(カスタムテキストは含まれていません)。
SELECT * FROM msdb.dbo.sysmail_sentitemsを実行し、十分な数の電子メールが2回送信されていることを確認しました。 sysmail_configurationを見ると、AccountRetryAttempts paramValue = 1であることがわかりました。
ストアドプロシージャから@queryを完全に削除し(変更を実行)、spを実行すると、問題は解決しました。次に、@ queryをspに戻し、変更を実行します。その後、メールは1回だけ送信され始めました。図に行きます。
これは、電子メールを受信するアドレス(グループまたは個人)の電子メールアドレスが無効になっているために発生します。受け入れられた回答のように再試行を排除することはできますが、最善のアプローチはディストリビューションをクリーンアップすることです。
更新時のサイドトリガーの他のトリガーに他のUpdateステートメントがないことを確認してください。
同様の問題に直面した場合でも、トリガーとクロスチェックすると、別のトリガーで別のUpdateステートメントを使用していることがわかりました。トリガーに複数の発砲が発生しました。したがって、2つのメールがトリガーされました。
1つのメールに複数の受信者がいて、2通の送信メールが生成されるという同様の問題がありました。問題は、受信者の1人が無効になり、再試行すると、失敗した受信者だけでなく、すべての受信者に電子メールが送信されることになりました。 msdbには、無効な受信者を見つけるのに役立つビューがいくつかあります。彼らはdbo.sysmail_ <something>を開始します
この問題にはいくつかの解決策があります。