データベース メールのトラブルシューティングの一般的な手順

適用対象: SQL ServerAzure SQL Managed Instance

データベース メールのトラブルシューティングを行うには、データベース メール システムに関して次の点を確認する必要があります。 以下の手順は論理的な順序で示していますが、どのような順序で行ってもかまいません。

アクセス許可

データベース メールのどの領域の問題を解決するにしても、sysadmin 固定サーバー ロールのメンバーである必要があります。 sysadmin 固定サーバー ロールのメンバーでないユーザーは、自身が送信した電子メールに関する情報しか入手できず、他のユーザーが送信した電子メールに関する情報は入手できません。

データベース メールが有効になっているか

  1. SQL Server Management Studio のクエリ エディター ウィンドウを使用して SQL Server のインスタンスに接続し、次のコードを実行します。

    sp_configure 'show advanced', 1; 
    GO
    RECONFIGURE;
    GO
    sp_configure;
    GO
    

    結果ウィンドウで、Database Mail XPs の run_value が 1 に設定されていることを確認します。 run_value が 1 でない場合、データベース メールは無効です。 悪意のあるユーザーから攻撃を受ける機能の数を少なくするため、データベース メールは自動的には有効になりません。 詳細については、セキュリティ構成を理解する方法に関するページを参照してください。

  2. データベース メールを有効にすることが適切であると判断した場合は、次のコードを実行します。

    sp_configure 'Database Mail XPs', 1; 
    GO
    RECONFIGURE;
    GO
    
  3. sp_configure プロシージャを既定の状態に戻して、詳細設定オプションが表示されないようにするには、次のコードを実行します。

    sp_configure 'show advanced', 0; 
    GO
    RECONFIGURE;
    GO
    

ユーザーにメール送信が正しく設定されているか

  1. データベース メールを送信するには、msdb データベースの DatabaseMailUserRole データベース ロールのメンバーにユーザーがなる必要があります。 sysadmin 固定サーバー ロールと msdbdb_owner ロールのメンバーは、自動的に DatabaseMailUserRole ロールのメンバーになります。 DatabaseMailUserRole の他のすべてのメンバーを一覧するには、次のステートメントを実行します。

    EXEC msdb.sys.sp_helprolemember 'DatabaseMailUserRole';
    
  2. DatabaseMailUserRole ロールにユーザーを追加するには、次のステートメントを使用します。

    USE msdb;
    GO
    
    sp_addrolemember @rolename = 'DatabaseMailUserRole'
    ,@membername = '<database user>';
    
  3. データベース メールを送信するユーザーは、少なくとも 1 つのデータベース メール プロファイルにアクセスできる必要があります。 ユーザー (プリンシパル) とそのユーザーがアクセスできるプロファイルを一覧するには、次のステートメントを実行します。

    EXEC msdb.dbo.sysmail_help_principalprofile_sp;
    
  4. データベース メール構成ウィザードを使用してプロファイルを作成し、ユーザーにそのプロファイルへのアクセス許可を与えます。

データベース メールが起動しているか

  1. 処理する電子メール メッセージがあると、データベース メール外部プログラムがアクティブになります。 指定されたタイムアウト期間内に送信するメッセージがなくなると、プログラムが終了します。 データベース メールのアクティブ化が開始されことを確認するには、次のステートメントを実行します。

    EXEC msdb.dbo.sysmail_help_status_sp;
    
  2. データベース メールのアクティブ化が開始されていない場合は、次のステートメントを実行して開始します。

    EXEC msdb.dbo.sysmail_start_sp;
    
  3. データベース メール外部プログラムが開始されている場合は、次のステートメントを使用してメール キューの状態を確認します。

    EXEC msdb.dbo.sysmail_help_queue_sp @queue_type = 'mail';
    

    メール キューの状態は RECEIVES_OCCURRING になっている必要があります。 キューの状態は刻一刻と変化します。 メールキューの状態が RECEIVES_OCCURRING ではない場合、キューの再起動をお試しください。 次のステートメントでキューを停止します。

EXEC msdb.dbo.sysmail_stop_sp;

停止後、次のステートメントでキューを開始します。

EXEC msdb.dbo.sysmail_start_sp;

注意

メール キュー内の電子メールの数を判断するには、sysmail_help_queue_sp の結果セットの length 列を使用します。

問題は一部のアカウントに影響を与えるのか、全部のアカウントに影響を与えるのか

  1. すべてのプロファイルではなく、一部のプロファイルしかメールを送信できていない場合は、メールを送信できないプロファイルで使用されているデータベース メール アカウントに問題があると考えられます。 メールを正しく送信できるアカウントを確認するには、次のステートメントを実行します。

    SELECT sent_account_id, sent_date FROM msdb.dbo.sysmail_sentitems;
    
  2. 一覧表示されたアカウントのいずれも、メールを送信できないプロファイルで使用されていない場合、そのプロファイルで使用可能なアカウントがすべて正しく機能していない可能性があります。 個々のアカウントをテストするには、データベース メール構成ウィザードを使用して、アカウントを 1 つだけ含む新しいプロファイルを作成します。次に、[テスト電子メールの送信] ダイアログ ボックスを使用し、このアカウントでメールを送信します。

  3. データベース メールから返されたエラー メッセージを表示するには、次のステートメントを実行します。

    SELECT * FROM msdb.dbo.sysmail_event_log;
    

    注意

    データベース メールでは、メールが SMTP メール サーバーに正常に配信されると、メールが送信されたと見なします。 その後、受信者の電子メール アドレスが無効であるなどのエラーが発生しメールが配信されなくても、データベース メールのログにはそのことが記録されません。

メール配信を再試行する

  1. SMTP サーバーに確実に到達できないことが原因でデータベース メールが失敗していると思われる場合は、データベース メールからの各メッセージの送信試行回数を増加することで、正常なメール配信率を向上できることがあります。 データベース メール構成ウィザードを起動して、[システム パラメーターを表示または変更する] オプションを選択します。 または、プロファイルに関連付けるアカウント数を増やすこともできます。これにより、プライマリ アカウントからのフェールオーバー時には、フェールオーバー アカウントを使用して電子メールが送信されるようになります。

  2. [システム パラメーターの構成] ページの [アカウントの再試行回数] の 5 回、[アカウントの再試行間隔] の 60 秒という既定値は、SMTP サーバーに 5 分間到達できないと、メッセージの配信に失敗することを意味しています。 この 2 つのパラメーター値を増加することで、メッセージの配信に失敗するまでの時間を長くすることができます。

    注意

    送信されるメッセージが多い場合、この既定値を大きくすると確実性は高くなりますが、大量のメッセージの配信が何度も試行されるので、リソースの使用量も大幅に増加することになります。 ネットワークや SMTP サーバーに、データベース メールから SMTP サーバーへの即時アクセスを妨害するような問題があれば、それを解決することで、根本的な問題点に対処してください。

msdb で サービス ブローカーが有効になっていることを確認します。

データベース メールでは、msdb データベースに対して Service Broker を有効にする必要があります。 次の T-SQL スクリプトを使用して、サービス ブローカーが msdb で有効になっているかどうかを確認します。

SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb' ; -- should be 1

有効になっていない場合は、サービス ブローカーを有効にする必要があります。 次のサンプル スクリプトでは、 msdb システム データベースへの排他的アクセスが必要であるため、一般的な営業時間中に実行できない場合があります。 詳細については、ALTER DATABASE ... SET ENABLE_BROKER に関するページを参照してください。

ALTER DATABASE msdb SET ENABLE_BROKER;

次のステップ