データベースメール:Microsoft SQL Serverからの直接メール送信

多くの人々は、バージョン2005以降、SQL Serverには電子メールを送信する機能が組み込まれていることを知っています。データベース管理者は、スケジュールされたタスクが失敗した場合など、緊急アラートを送信するためにこれを使用することがよくあります。 ただし、SQLクエリ、関数、ストアドプロシージャから直接SQL Serverに文字を送信できることを知っている人はわずかです。 また、SQL Serverで既にメールをセットアップしている場合は、レターの送信に1分かかり、15〜20分でメール全体を整理できます。 このシステムはデータベースメール(DBMail)と呼ばれ、今日はその使用経験を共有したいと思います。



カスタマイズ



DBMailを使用する前に、まずシステムの電源を入れ、そこにメールの送信元(SMTP)を登録する必要があります。 残念ながら、システムはIMAPの操作方法を知りませんが、ほとんどの場合、これは必要ありません。



SQL Server管理者インターフェイスを介したDBMailのセットアップは非常に適切で、記事「MS SQL Server 2005以降でのデータベースメールのセットアップ」で詳しく説明されているため、繰り返しません。 このオプションは、システムを初めてセットアップする人にとってより便利だと思います。



次に、別の方法を示します。SQLスクリプトを使用してプログラムで構成する方法です。 このオプションはそれほど明白ではありませんが、多くのサーバーでDBMailを構成したり、サーバーからサーバーに設定を転送したりする必要がある人にとっては、より高速で便利です。この場合、このスクリプトを新しいサーバーで実行するだけで十分です。 次のスクリプトを使用するには、sysadminグループのメンバーとしてサーバーにログインする必要があることを忘れないでください。そうしないと、セキュリティシステムが権限の欠如を示します。



すぐにポイントを取得しましょう。 DBMailを使用するためにサーバーを準備するスクリプトは次のとおりです。

--   Service broker -      -- ,  DBMail IF (SELECT is_broker_enabled FROM sys.databases WHERE [name] = 'msdb') = 0 ALTER DATABASE msdb SET ENABLE_BROKER WITH ROLLBACK AFTER 10 SECONDS GO --    DBMail sp_configure 'Database Mail XPs', 1 GO RECONFIGURE GO
      
      





次に、DBMailサービスが実行されているかどうかを確認します。

 EXECUTE msdb.dbo.sysmail_help_status_sp
      
      





そして、実行されていない(ステータスが「開始済み」ではない)場合は、リクエストで実行します

 EXECUTE msdb.dbo.sysmail_start_sp
      
      





次に、レターを送信するためのSMTPアカウントを作成し、メーリングリストの管理者プロファイルを作成し、SMTPアカウントをこのプロファイルに接続する必要があります。 MySite.ruサイト管理者が自分のサイトの登録ユーザーのメーリングリストを整理する必要があり、そのためにsmtp.mysite.ruサーバーのadmin@mysite.ruメールボックスを使用するとします。

 --  SMTP-    EXECUTE msdb.dbo.sysmail_add_account_sp --   @account_name = 'admin@mysite.ru', --    @description = N'  admin@mysite.ru', --   @email_address = 'admin@mysite.ru', -- ,      ":" @display_name = N' MySite.ru', -- ,        --    ,   "no-reply" @replyto_address = 'no-reply@please.no-reply', --   IP- SMTP- @mailserver_name = 'smtp.mysite.ru', --  SMTP-,  25 @port = 25, --  .       --        @username = 'admin', --     @password = 'MyPassword', --  SSL  ,  SMTP-   SSL @enable_ssl = 1; --      EXECUTE msdb.dbo.sysmail_add_profile_sp @profile_name = 'MySite Admin Mailer'; --  SMTP-    EXECUTE msdb.dbo.sysmail_add_profileaccount_sp @profile_name = 'MySite Admin Mailer', @account_name = 'admin@mysite.ru', --   SMTP-   @sequence_number = 1; --        DatabaseMailUserRole  MSDB EXECUTE msdb.dbo.sysmail_add_principalprofile_sp @profile_name = 'MySite Admin Mailer', @principal_id = 0, @is_default = 1;
      
      





信頼性のために、2つの異なるメールサービス用のSMTPアカウントのペアを作成し、それらをプロファイルに接続することをお勧めします。 これにより、SMTPサーバーの1つと通信できない場合でも、重要な手紙を送信できます。 この場合、優先SMTPアカウントの場合、sysmail_add_profileaccount_spプロシージャの@sequence_numberパラメーターは1(上記参照)である必要があり、バックアップアカウントの場合、パラメーターは2である必要があります。



プライベートドメインメールボックスからの大量メール送信が推奨されます。 パブリックドメインメールボックス(yandex.ru、mail.ru、gmail.comなどへのメールボックス)から送信しようとすると、SMTPサーバーはあなたをスパマーと見なし、メーリングリストまたはメールボックス全体をブロックする場合があります。



ファイアウォール



別のプログラムが、SQL Serverへのダイレクトメール送信を処理します。 SQL Serverの異なるバージョンでは、「DatabaseMail90.exe」または「DatabaseMail.exe」と呼ばれ、デフォルトでは「C:\ Program Files \ Microsoft SQL Server \ ... \ MSSQL \ Binn \」フォルダにあります。 ファイアウォール(ファイアウォール)で送信トラフィックを許可することを忘れないことが重要です。



テストレター



それは試してみる時間です、すべて大丈夫です。 sysadminグループのユーザー、MSDBデータベースの所有者(db_owner)、またはDatabaseMailUserRoleロールを持つユーザーは、テストレターを送信できます。 DatabaseMailUserRoleロールをユーザーに追加するには、標準のsp_addrolememberプロシージャを使用します。

 sp_addrolemember @rolename = 'DatabaseMailUserRole', @membername = '<_>';
      
      





次に、テストレターを送信します。

 EXEC msdb.dbo.sp_send_dbmail --       @profile_name = 'MySite Admin Mailer', --   @recipients = 'friend@mysite.ru', --   @body = N'  SQL Server Database Mail', --  @subject = N' ', --        SQL- @query = 'SELECT TOP 10 name FROM sys.objects';
      
      





sp_send_dbmailプロシージャの追加パラメータは、 MSDNの説明に記載されています



何かが間違っている場合は、まず手紙のステータスを確認する必要があります。

 SELECT * FROM msdb.dbo.sysmail_allitems
      
      





そして、ログを見てください:

 SELECT * FROM msdb.dbo.sysmail_event_log
      
      





最も一般的な問題は、MSDNの記事「Troubleshooting Database Mail」および記事「DBAのSQL Serverタスク:データベースメールのトラブルシューティング 」で対処されています



正常に送信されたレターは、次のSQLクエリで表示できます。

 SELECT sent_account_id, sent_date FROM msdb.dbo.sysmail_sentitems
      
      





メーリングリスト



ここで、MySite.ruサイト管理者が自分のサイトのユーザーのテーブルから1年以上サイトにアクセスしていない人を選択し、招待状を送信する必要があるとします。 具体的には、実際の状況を取り上げて、カーソルやループなど、DBMailおよびSQLのより多くの機能を実証します。 タスクを複雑にするために、さらにいくつかの条件を追加します。



 --     mysite USE mysite GO --  :  , , --     ,   DECLARE @user_id int, @user_name nvarchar(255), @last_login_date smalldatetime, @email_address varchar(255); --  @body       HTML DECLARE @body nvarchar(MAX); --  @no_mail   ,    DECLARE @no_mail int; --    ,      --        FAST_FORWARD DECLARE users CURSOR LOCAL FAST_FORWARD FOR SELECT id, name, last_login_date, email_address FROM users WHERE user_role IN (3,4,5) AND account_state = 2 AND email_address IS NOT NULL AND DATEDIFF(day, last_login_date, GETDATE()) > 365 ORDER BY id --      ,   3   WAITFOR TIME '03:00:00' --   users OPEN users --       FETCH NEXT FROM users INTO @user_id, @user_name, @last_login_date, @email_address --      WHILE @@FETCH_STATUS = 0 BEGIN -- ,       SET @no_mail = (SELECT id FROM users WHERE id = @user_id AND allow_mail = 0) --  ,      IF @no_mail IS NOT NULL BEGIN PRINT N' ' + @user_name + N'   .' FETCH NEXT FROM users INTO @user_id, @user_name, @last_login_date, @email_address CONTINUE END PRINT N'   ' + @email_address + N' ...' --    SET @body = N' <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <p><img style="float:right;" src="http://mysite.ru/images/logo.png"/></p> <p>, ' + @user_name + N'!</p> <p>     MySite.ru.       ,  ,            .</p> <p> !</p> <p> ,   MySite.ru</p> </body> </html>'; --   EXEC msdb.dbo.sp_send_dbmail @recipients = @email_address, @subject = N'     MySite.ru', @body = @body, --      'HTML',  'TEXT' @body_format = 'HTML', --        --@file_attachments ='C:\attachment.jpg', --        --@copy_recipients ='me@gmail.com', -- "Blind copy"  "carbon copy" -    , --         --@blind_copy_recipients ='me2@gmail.com', --        @profile_name = 'MySite Admin Mailer'; --    3   ,    SMTP- WAITFOR DELAY '00:00:03'; --         FETCH NEXT FROM users INTO @user_id, @user_name, @last_login_date, @email_address END --     CLOSE users GO
      
      





すべて準備完了です。 休息することができます。



All Articles