多くの人々は、バージョン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を使用するためにサーバーを準備するスクリプトは次のとおりです。
次に、DBMailサービスが実行されているかどうかを確認します。
EXECUTE msdb.dbo.sysmail_help_status_sp
そして、実行されていない(ステータスが「開始済み」ではない)場合は、リクエストで実行します
EXECUTE msdb.dbo.sysmail_start_sp
次に、レターを送信するためのSMTPアカウントを作成し、メーリングリストの管理者プロファイルを作成し、SMTPアカウントをこのプロファイルに接続する必要があります。 MySite.ruサイト管理者が自分のサイトの登録ユーザーのメーリングリストを整理する必要があり、そのためにsmtp.mysite.ruサーバーのadmin@mysite.ruメールボックスを使用するとします。
信頼性のために、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
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のより多くの機能を実証します。 タスクを複雑にするために、さらにいくつかの条件を追加します。
- 登録中に手紙を受け取りたくないと言った人には手紙を送ってはいけません。 さらに複雑にするために、ループで別のSQLクエリを使用して失敗した人を特定します。
- 文字はHTML形式でなければなりません。
- SMTPサーバーが過負荷にならないように、手紙は3秒間隔で送信する必要があります。
- 配布は、SQLスクリプトの実行直後ではなく、たとえば午前3時に開始する必要があります。
すべて準備完了です。 休息することができます。