次の方法で共有


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

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

データベース メールが有効かどうかを判断するには

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

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

    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 でない場合は、sysmail_stop_sp を使用してキューを停止してから、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 サーバーへの即時アクセスを妨害するような問題があれば、それを解決することで、根本的な問題点に対処してください。

セキュリティ

データベース メールのあらゆる部分に関してトラブルシューティングを行うには、sysadmin 固定サーバー ロールのメンバである必要があります。sysadmin 固定サーバー ロールのメンバでないユーザーは、自身が送信した電子メールに関する情報しか入手できず、他のユーザーが送信した電子メールに関する情報は入手できません。