sql >> データベース >  >> RDS >> Sqlserver

SQL Server(T-SQL)から電子メールを送信する方法

    SQL Serverは、データベースメールソリューションを介して電子メールを送信する機能を提供します。

    メールを送信する実際の動作は、sp_send_dbmailを使用して行われます。 ストアドプロシージャ。ただし、SQL Serverから電子メールの送信を開始する前に、データベースメールを有効にして構成する必要があります。

    これは、SSMSGUIまたはT-SQLを使用して実行できます。

    この記事では、T-SQLでそれを行う方法を示します。データベースメールがシステムで有効にされたことがないことを前提としているため、データベースメールを有効にするための手順を実行します。

    SSMS GUIを使用する場合は、SQL Server(SSMS)でデータベースメールを設定する方法を参照してください。

    ステップ1:データベースメールXPを有効にする

    SQL Serverからメールを送信する前に最初に行う必要があるのは、データベースメール拡張ストアドプロシージャ(データベースメールXP)を有効にすることです。これらはmsdbにあります システムデータベース。

    これには、「詳細オプションの表示」が有効になっている必要もあります。

    これらはデフォルトで無効になっています。したがって、これまでシステムでデータベースメールを使用したことがない場合は、それらを有効にする必要があります。

    詳細オプションとデータベースメールXPを有効にする方法は次のとおりです。

    EXEC sp_configure 'show advanced options', '1';
    RECONFIGURE
    GO
    EXEC sp_configure 'Database Mail XPs', 1;
    RECONFIGURE
    GO

    SQLServerを再起動する必要はありません。これで、DatabaseMailXPが使用できるようになります。

    マイクロソフトでは、このような高度なオプションは、経験豊富なデータベース管理者または認定されたSQL Server技術者のみが変更することを実際に推奨していますが、この記事の目的上、メモリを更新する経験豊富なDB管理者であると想定します😉

    いずれにせよ、sp_configureを実行するために 構成オプションを変更するか、RECONFIGUREを実行するには、両方のパラメーターを使用します ステートメントでは、ALTER SETTINGSを付与する必要があります サーバーレベルの権限。 ALTER SETTINGS 権限はシステム管理者によって暗黙的に保持されます およびserveradmin 固定サーバーの役割。

    ステップ2:メールアカウントとプロファイルを作成する

    データベースメールは、ユーザーアカウントから直接送信されるのではなく、プロファイルを介して送信されます。

    データベースメールを使用して電子メールを送信するには、データベースメールアカウント、データベースメールプロファイルを作成し、アカウントをプロファイルに追加してから、ユーザーにそのプロファイルへのアクセスを許可する必要があります。ユーザーはmsdbにいる必要があります データベース。

    これを行うためのT-SQLコードは、次のようになります。

    -- Switch to the msdb database
    USE msdb;
    
    -- Create a user on the msdb database
    CREATE USER Marge FOR LOGIN Marge;
    
    -- Create a Database Mail account  
    EXECUTE msdb.dbo.sysmail_add_account_sp  
        @account_name = 'DB Admin',  
        @description = 'Mail account for admin emails.',  
        @email_address = '[email protected]',  
        @replyto_address = '[email protected]',  
        @display_name = 'DB Automated Mailer',  
        @mailserver_name = 'smtp.example.com',
        @port = 25;  
      
    -- Create a Database Mail profile  
    EXECUTE msdb.dbo.sysmail_add_profile_sp  
        @profile_name = 'DB Admin Profile',  
        @description = 'Profile for admin emails.';  
      
    -- Add the account to the profile  
    EXECUTE msdb.dbo.sysmail_add_profileaccount_sp  
        @profile_name = 'DB Admin Profile',  
        @account_name = 'DB Admin',  
        @sequence_number = 1;
      
    -- Grant the msdb user access to the Database Mail profile
    EXECUTE msdb.dbo.sysmail_add_principalprofile_sp
        @profile_name = 'DB Admin Profile',
        @principal_name = 'Marge',
        @is_default = 1;

    さまざまな詳細を独自のものに置き換える必要があります。これは、機能するメールサーバーを指定し、正しいポートを使用していることも前提としています。

    サーバーにMargeというログインがすでにあることに注意してください。ここでは、 msdbでユーザーを作成しました そのログイン用のデータベース。次に、最後の部分で、作成したプロファイルへのアクセスをそのユーザーに許可しました。

    この例では、1つのデータベースメールアカウントを作成し、それをプロファイルに追加しました。必要に応じて、プロファイルに複数のアカウントを追加できます。これは、メールを送信するときのフェイルオーバーとして役立ちます。最初のアカウントが失敗した場合、次のアカウントを試し、次のアカウントを試します。

    上記のコード(独自の詳細を含む)を取得すると、メールを送信できるようになります。

    ステップ3:メールを送信する

    前述のように、実際のメール送信はsp_send_dbmailを使用して行われます。 ストアドプロシージャ。

    次に例を示します:

    EXEC msdb.dbo.sp_send_dbmail  
        @profile_name = 'DB Admin Profile',  
        @recipients = '[email protected]',  
        @body = 'Your favorite SQL Server Agent job just failed',  
        @subject = 'SQL Server Agent Job: FAILED';

    これは、受信者、件名、メール本文などの基本事項が記載されたシンプルなメールです。

    プロファイルを指定しない場合、プロシージャは現在のユーザーのデフォルトのプライベートプロファイルを使用します。ユーザーのデフォルトのプライベートプロファイルがない場合は、 msdbのデフォルトのパブリックプロファイルが使用されます データベース。デフォルトの公開プロファイルがない場合は、エラーが発生します。

    その他のオプション

    sp_send_dbmail プロシージャは、この例で使用したものよりもかなり多くの引数を受け入れます。

    sp_send_dbmailの公式構文は次のとおりです。 手順:

    sp_send_dbmail [ [ @profile_name = ] 'profile_name' ]  
        [ , [ @recipients = ] 'recipients [ ; ...n ]' ]  
        [ , [ @copy_recipients = ] 'copy_recipient [ ; ...n ]' ]  
        [ , [ @blind_copy_recipients = ] 'blind_copy_recipient [ ; ...n ]' ]  
        [ , [ @from_address = ] 'from_address' ]  
        [ , [ @reply_to = ] 'reply_to' ]   
        [ , [ @subject = ] 'subject' ]   
        [ , [ @body = ] 'body' ]   
        [ , [ @body_format = ] 'body_format' ]  
        [ , [ @importance = ] 'importance' ]  
        [ , [ @sensitivity = ] 'sensitivity' ]  
        [ , [ @file_attachments = ] 'attachment [ ; ...n ]' ]  
        [ , [ @query = ] 'query' ]  
        [ , [ @execute_query_database = ] 'execute_query_database' ]  
        [ , [ @attach_query_result_as_file = ] attach_query_result_as_file ]  
        [ , [ @query_attachment_filename = ] query_attachment_filename ]  
        [ , [ @query_result_header = ] query_result_header ]  
        [ , [ @query_result_width = ] query_result_width ]  
        [ , [ @query_result_separator = ] 'query_result_separator' ]  
        [ , [ @exclude_query_output = ] exclude_query_output ]  
        [ , [ @append_query_error = ] append_query_error ]  
        [ , [ @query_no_truncate = ] query_no_truncate ]   
        [ , [ @query_result_no_padding = ] @query_result_no_padding ]   
        [ , [ @mailitem_id = ] mailitem_id ] [ OUTPUT ]

    各引数の詳細な説明については、Microsoftのドキュメントを参照してください。

    データベースメールリファレンス

    データベースメールチュートリアルの包括的なリストについては、データベースメールチュートリアルを参照してください。各チュートリアルはデータベースメールの特定の部分を扱っているため、これは優れたリファレンスになる可能性があります。


    1. SQLServer2005にクラスター化インデックスがない理由

    2. MySQL FIND_IN_SETまたは同等のものにインデックスを使用させることはできますか?

    3. パート2–大規模なデータベース図を整理する方法

    4. PostgreSQLと認証システムの統合