1

sp_send_dbmailSQL Server 2005 で使用しているときに何が起こっているかについての答えを見つけたいと思っています。

これはシナリオです:

SQL サーバーにメール機能を設定しました。あるテーブルに電子メール アドレスがあり、別のテーブルにコンテンツがあります。テーブルで見つかったアドレスごとに、sp_send_dbmailストアド プロシージャを使用して、そのアドレスへの新しいメッセージをコンパイルします。

後で上記を実行する独自の SP を実行すると (電子メールを受け取り、受信者への新しいメッセージをコンパイルします)、サーバー上で DatabaseMail90.exe が起動し、電子メールが送信されます。しかし、これが厄介なところです。メールの一部が直接配布されているためです。おそらく同じドメインとネットワーク上にあるためです。複雑なのは、すべてではありませんが、ほとんどの外部メールが msdb.dbo.sysmail_mailitems テーブルでエラーを受け取ることです。しかし、混乱はここで止まりません。msdb.dbo.sysmail_mailitems テーブルにエラーが報告されているにもかかわらず、一部の電子メールは配信されています。

これは、送信済みメッセージのステータスを表示するために使用するクエリです。

SELECT
    mailitem_id,
    recipients,
    subject,
    send_request_date,
    sent_status, --0 new, not sent, 1 sent, 2 failure or 3 retry.
    sent_date
FROM 
    msdb.dbo.sysmail_mailitems
WHERE
    sent_status != 1

データベース メールのシステム パラメータを次のように構成しました。

  • アカウントの再試行回数: 3
  • アカウント再試行遅延 (秒): 30
  • 最大ファイル サイズ (バイト): 50000000 (これほど大きくなることはありませんが、安全のために)
  • 添付禁止拡張子:exe、dll、vbs、js
  • データベース メール実行可能ファイルの最小有効期間 (秒): 300
  • ロギング レベル: 拡張

私のデータベース メール プロファイルは公開されており、既定のプロファイルとして設定されています。また、既存のプロファイルを設定しました。

これは、すべてを実行してメールの送信を開始する SP です。

DECLARE @fldEmail AS VARCHAR(max)
DECLARE @fldSubject AS VARCHAR(max)
DECLARE @fldMessage AS VARCHAR(max)
DECLARE port_cursor CURSOR FOR
SELECT d.[E-Mail],s.Subject,s.HTMLMessage
FROM tbl_NAV_Sendout s,tbl_NAV_DistributionList d
OPEN port_cursor
FETCH NEXT FROM port_cursor
INTO @fldEmail, @fldSubject, @fldMessage
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC msdb.dbo.sp_send_dbmail @recipients = @fldEmail, @subject = @fldSubject, @body = @fldMessage, @body_format = 'HTML', @file_attachments = 'C:\NAVDW\ECNAV.csv', @profile_name = 'DBMail'
FETCH NEXT FROM port_cursor
INTO @fldEmail, @fldSubject, @fldMessage
END
CLOSE port_cursor
DEALLOCATE port_cursor

したがって、疑問は残ります。電子メールをより速く配信するためにセットアップを微調整する方法はありますか? また、本当の質問ですが、電子メールの送信時にエラーが時々発生するのはなぜですか? 送信先のメールアドレスに問題はありません。コードまたはデータベース メール構成で考えられるエラーを見つけるには、どこを参照すればよいですか? このようなことを経験したことがありますか?

msdb.dbo.sysmail_mailitems テーブルのエラーの説明は何ですか? つまり、外部ドメインにエラーが報告されていますが、メールは配信されています。または、メールが配信されない場合、問題の原因をどこで調べればよいでしょうか。

4

1 に答える 1

0

WAITFOR DELAY以下のように、SQLクエリに関数を追加してみてください:

DECLARE @fldEmail AS VARCHAR(max)  
DECLARE @fldSubject AS VARCHAR(max)  
DECLARE @fldMessage AS VARCHAR(max)  
DECLARE port_cursor CURSOR FOR  
SELECT d.[E-Mail],s.Subject,s.HTMLMessage  
FROM tbl_NAV_Sendout s,tbl_NAV_DistributionList d  
OPEN port_cursor  
FETCH NEXT FROM port_cursor  
INTO @fldEmail, @fldSubject, @fldMessage  
WHILE @@FETCH_STATUS = 0  
BEGIN  
WAITFOR DELAY '000:00:10'  
EXEC msdb.dbo.sp_send_dbmail @recipients = @fldEmail, @subject = @fldSubject, @body =   @fldMessage, @body_format = 'HTML', @file_attachments = 'C:\NAVDW\ECNAV.csv',   @profile_name = 'DBMail'  
FETCH NEXT FROM port_cursor  
INTO @fldEmail, @fldSubject, @fldMessage  
END  
CLOSE port_cursor  
DEALLOCATE port_cursor  

これにより実行が遅くなりますが、この関数を追加すると、SQL Server がカーソルを使用してデータを効率的に入力し、電子メールを配信するのに十分な時間が与えられます。私の場合、それは完全にうまくいきました。

于 2014-08-11T11:48:42.200 に答える