37

sp_send_dbmailを使用してキューに入れられた特定の電子メールが最終的に Exchange サーバーから正常に送信されたかどうかを確認する方法を探しています。システム テーブルmsdb.dbo.sysmail_mailitemsmsdb.dbo.sysmail_log. msdb.dbo.sysmail_log2 つのうちのほうが役立つようです。具体的には、そのdescription列。これまでに行ったテストから、エラーが発生するたびに、次の形式のメッセージがdescription列に表示されるようです。

メールサーバーに障害が発生したため、メールを受信者に送信できませんでした。(アカウント 3 を使用してメールを送信 (2012-11-01T11:28:04). 例外メッセージ: メール サーバーにメールを送信できません。(メールボックスを利用できません。サーバーの応答は: 5.7.1 Unable to Relay for thisemail@email.com) . )

これは、同じ を共有する他の行に囲まれていますprocess_id。同封するレコードの説明は次のとおりです。

DatabaseMail プロセスが開始されました

DatabaseMail プロセスがシャットダウンしています

電子メールが正常に送信された場合、同じ 2 つの行がテーブルに記録されますが、その間に行が囲まれていません。

送信が成功すると、表に次のように表示されます

ここに画像の説明を入力

送信に失敗した場合、ログにはこれが記録されます

ここに画像の説明を入力

送信が失敗した場合、または送信が成功した場合にエントリをログに記録する方法の他の例はありますか? たとえば、送信用に 4 行のエントリがある可能性があります (2 行が開始時と終了時を示し、2 行が電子メールが正常に送信されたことを示します)。上記のパターンから逸脱したログ レコードは見つかりませんでしたが、この仮定に基づいてロジックを記述する前に確認したいと思います。

4

2 に答える 2

42

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())
于 2014-09-26T21:45:56.730 に答える
9

Microsoftからのこのリンクは便利なようです-方法:データベースメールで送信された電子メールメッセージのステータスを確認する(Transact-SQL)。データベースメールのログと監査、データベースメールのトラブルシューティングに関する関連トピックも参照してください。

于 2013-02-01T18:38:52.663 に答える