sp_send_dbmail (Transact-SQL)

適用対象: SQL ServerAzure SQL Managed Instance

指定した受信者に電子メール メッセージを送信します。 メッセージには、クエリ結果セット、添付ファイル、またはその両方が含まれる場合があります。 メールがデータベース メール キューに正常に配置されると、sp_send_dbmailメッセージの内容がmailitem_id返されます。 このストアド プロシージャはデータベースにあります msdb

Transact-SQL 構文表記規則

構文

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 = ] N'subject' ]
    [ , [ @body = ] N'body' ]
    [ , [ @body_format = ] 'body_format' ]
    [ , [ @importance = ] 'importance' ]
    [ , [ @sensitivity = ] 'sensitivity' ]
    [ , [ @file_attachments = ] N'attachment [ ; ...n ]' ]
    [ , [ @query = ] N'query' ]
    [ , [ @execute_query_database = ] 'execute_query_database' ]
    [ , [ @attach_query_result_as_file = ] attach_query_result_as_file ]
    [ , [ @query_attachment_filename = ] N'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 ]
[ ; ]

引数

[ @profile_name = ] 'profile_name'

メッセージを送信するプロファイルの名前。 @profile_nameは sysnameで、既定値は NULL. @profile_name、既存のデータベース メール プロファイルの名前である必要があります。 @profile_nameが指定されていない場合は、sp_send_dbmail現在のユーザーの既定のプライベート プロファイルを使用します。 ユーザーが既定のプライベート プロファイルを持っていない場合は、 sp_send_dbmail データベースの既定のパブリック プロファイルを msdb 使用します。 ユーザーに既定のプライベート プロファイルがなく、データベースの既定のパブリック プロファイルがない場合は、 @profile_name を指定する必要があります。

[ @recipients = ] 'recipients'

メッセージを送信する電子メール アドレスのセミコロン区切りのリスト。 受信者リストの型 は varchar(max)です。 このパラメーターは省略可能ですが、少なくとも 1 つの @recipients@copy_recipients、または @blind_copy_recipients を指定するか sp_send_dbmail 、エラーを返す必要があります。

[ @copy_recipients = ] 'copy_recipients'

メッセージのカーボン コピー先の電子メール アドレスのセミコロン区切りのリスト。 コピー受信者リストの型 は varchar(max)です。 このパラメーターは省略可能ですが、少なくとも 1 つの @recipients@copy_recipients、または @blind_copy_recipients を指定するか sp_send_dbmail 、エラーを返す必要があります。

[ @blind_copy_recipients = ] 'blind_copy_recipients'

メッセージのコピー先のブラインド カーボンの電子メール アドレスのセミコロン区切りのリスト。 ブラインド コピー受信者リストの型 は varchar(max)です。 このパラメーターは省略可能ですが、少なくとも 1 つの @recipients@copy_recipients、または @blind_copy_recipients を指定するか sp_send_dbmail 、エラーを返す必要があります。

[ @from_address = ] 'from_address'

電子メール メッセージの "from address" の値。 これは、メール プロファイルの設定をオーバーライドするために使用される省略可能なパラメーターです。 このパラメーターの型 は varchar(max)です。 オーバーライドが許可されるかどうかは、SMTP のセキュリティ設定によって決まります。 パラメーターが指定されていない場合、既定値は NULL.

[ @reply_to = ] 'reply_to'

電子メール メッセージの "アドレスへの返信" の値。 有効な値として受け取る電子メール アドレスは 1 つだけです。 これは、メール プロファイルの設定をオーバーライドするために使用される省略可能なパラメーターです。 このパラメーターの型 は varchar(max)です。 オーバーライドが許可されるかどうかは、SMTP のセキュリティ設定によって決まります。 パラメーターが指定されていない場合、既定値は NULL.

[ @subject = ] N'subject'

電子メール メッセージの件名です。 サブジェクトは nvarchar(255) 型 です。 件名が指定されていない場合、既定値は "SQL Server メッセージ" です。

[ @body = ] N'body'

電子メール メッセージの本文。 メッセージ本文は nvarchar(max)で、既定値は NULL.

[ @body_format = ] 'body_format'

メッセージ本文の形式。 パラメーターは varchar(20)で、既定値は NULL. 指定した場合、送信メッセージのヘッダーには、メッセージの本文が指定の形式であることを示す文字列が設定されます。 パラメーターには、次のいずれかの値が含まれる場合があります。

  • TEXT (既定)
  • HTML

[ @importance = ] 'importance'

メッセージの重要度。 パラメーターは varchar(6) 型 です。 パラメーターには、次のいずれかの値が含まれる場合があります。

  • Low
  • Normal (既定)
  • High

[ @sensitivity = ] 'sensitivity'

メッセージの秘密度。 パラメーターは varchar(12) 型 です。 パラメーターには、次のいずれかの値が含まれる場合があります。

  • Normal (既定)
  • Personal
  • Private
  • Confidential

[ @file_attachments = ] N'file_attachments'

電子メール メッセージに添付するファイル名のセミコロン区切りのリスト。 リスト内のファイルは絶対パスとして指定する必要があります。 添付ファイルの一覧は nvarchar(max) 型 です。 既定では、データベース メールの添付ファイルは 1 ファイルにつき 1 MB に制限されます。

重要

このパラメーターは、ローカル ファイル システムにアクセスできないため、Azure SQL Managed Instance では使用できません。

[ @query = ] N'query'

実行するクエリ。 クエリの結果は、ファイルとして添付することも、電子メール メッセージの本文に含めることもできます。 クエリは nvarchar(max)で、任意の有効な Transact-SQL ステートメントを含めることができます。 クエリは別のセッションで実行されるため、スクリプト呼び出し sp_send_dbmail のローカル変数はクエリで使用できません。

@query パラメーターを使用する場合、実行sp_send_dbmailするプリンシパルは、Microsoft Entra ID (旧称 Azure Active Directory) グループか Windows Active Directory グループかにかかわらず、グループの一部としてではなく、個人として接続する必要があります。 SQL Server ログイン、Windows ID、および Microsoft Entra ID はクエリを実行できますが、Azure SQL Managed Instance の偽装と EXECUTE AS の制限により、グループ メンバーは実行できません。

[ @execute_query_database = ] 'execute_query_database'

ストアド プロシージャがクエリを実行するデータベース コンテキスト。 このパラメーターは sysnameで、既定値は現在のデータベースです。 このパラメーターは、@queryが指定されている場合にのみ適用されます。

[ @attach_query_result_as_file = ] attach_query_result_as_file

クエリの結果セットを添付ファイルとして返すかどうかを指定します。 @attach_query_result_as_fileは bitで、既定値は 0.

値が0指定されている場合、@body パラメーターの内容の後に、電子メール メッセージの本文にクエリ結果が含まれます。 値 1が指定されている場合、結果は添付ファイルとして返されます。 このパラメーターは、@queryが指定されている場合にのみ適用されます。

[ @query_attachment_filename = ] N'query_attachment_filename'

クエリ添付ファイルの結果セットに使用するファイル名を指定します。 @query_attachment_filenameは nvarchar(255)で、既定値は NULL. @attach_query_result_as_fileの場合、このパラメーターは0無視されます。 @attach_query_result_as_fileが1指定され、このパラメーターが指定されている場合NULLデータベース メールは任意のファイル名を作成します。

[ @query_result_header = ] query_result_header

クエリの結果に列のヘッダーを含めるかどうかを指定します。 query_result_header値はビットです。 値が指定されている場合、 1クエリ結果には列ヘッダーが含まれます。 値が指定されている 0場合、クエリ結果には列ヘッダーは含まれません。 このパラメーターの既定値は 1. このパラメーターは、@queryが指定されている場合にのみ適用されます。

@query_result_headerを設定 し、@query_no_truncate0 次のように設定 すると、次のエラーが 発生する 1可能性があります。

Msg 22050, Level 16, State 1, Line 12: Failed to initialize sqlcmd library with error number -2147024809.

[ @query_result_width = ] query_result_width

クエリの結果の書式設定に使用する行の幅 (文字単位)。 @query_result_widthは intで、既定値は 256. 指定する値は、次の値の3276710である必要があります。 このパラメーターは、@queryが指定されている場合にのみ適用されます。

[ @query_result_separator = ] 'query_result_separator'

クエリの出力で列の区切りに使用された文字。 区切り記号は char(1) 型 です。 既定値は ' ' (スペース) です。

[ @exclude_query_output = ] exclude_query_output

電子メール メッセージ内にクエリ実行の出力を返すかどうかを指定します。 @exclude_query_outputはビットで、既定値は 0. このパラメーターを 0指定すると、ストアド プロシージャの sp_send_dbmail 実行によって、コンソールでのクエリ実行の結果として返されるメッセージが出力されます。 このパラメーターの 1場合、ストアド プロシージャを sp_send_dbmail 実行しても、コンソールにクエリ実行メッセージは出力されません。

[ @append_query_error = ] append_query_error

@query引数で指定したクエリからエラーが返されたときに電子メールを送信するかどうかを指定します。 @append_query_errorはビットで、既定値は 0. このパラメーターを1指定すると、データベース メールは電子メール メッセージを送信し、電子メール メッセージの本文にクエリ エラー メッセージを含めます。 このパラメーターが0指定されている場合、データベース メールは電子メール メッセージを送信せず、sp_send_dbmailエラーを示すリターン コード1で終わります。

[ @query_no_truncate = ] query_no_truncate

大きな可変長データ型 (varchar(max)、nvarchar(max)、varbinary(max)、xml、text、ntext、imageおよびユーザー定義データ型の切り捨てを回避するオプションを使用してクエリを実行するかどうかを指定します。 設定すると、クエリ結果に列ヘッダーは含まれません。 @query_no_truncate値はビットです。 値 0 が指定されていない場合、クエリ内の列は 256 文字に切り捨てられます。 値が指定されている 1場合、クエリ内の列は切り捨てられません。 このパラメーターの既定値は 0.

Note

大量のデータと共に使用すると、 @query_no_truncate オプションによって追加のリソースが消費され、サーバーのパフォーマンスが低下する可能性があります。

[ @query_result_no_padding = ] query_result_no_padding

型はビットです。 既定値は、0 です。 に 1設定すると、クエリ結果が埋め込まれないので、ファイル サイズが小さくなる可能性があります。 @query_result_width パラメーターを設定@query_result_no_paddingすると、@query_result_no_padding パラメーターによって @query_result_width パラメーターが上書きされます。1

この場合、エラーは発生しません。

@query_result_no_paddingを設定し、@query_no_truncate1のパラメーターを指定すると、次のエラーが発生する可能性があります。

Msg 22050, Level 16, State 1, Line 0: Failed to execute the query because the @query_result_no_append and @query_no_truncate options are mutually exclusive.

@query_result_no_padding1設定し、@query_no_truncate パラメーターを設定すると、エラーが発生します。

[ @mailitem_id = ] mailitem_id [ OUTPUT ]

オプションの出力パラメーターは、メッセージの mailitem_id 値を返します。 @mailitem_idは intです。

リターン コードの値

戻りコードは成功を 0 意味します。 その他の値は失敗を意味します。 失敗したステートメントのエラー コードが変数に @@ERROR 格納されます。

結果セット

成功すると、"メールがキューに登録されました。" というメッセージが返されます。

解説

使用する前に、データベース メール構成ウィザードsp_configureを使用してデータベース メールを有効にする必要があります。

sysmail_stop_spは、外部プログラムが使用する Service Broker オブジェクトを停止することによって、データベース メールを停止します。 sp_send_dbmailを使用sysmail_stop_spしてデータベース メールが停止した場合でもメールを受け入れます。 データベース メールを開始するには、次を使用しますsysmail_start_sp

@profileが指定されていない場合は、sp_send_dbmail既定のプロファイルを使用します。 電子メール メッセージを送信するユーザーに既定のプライベート プロファイルがある場合、データベース メールではそのプロファイルが使用されます。 ユーザーに既定のプライベート プロファイルがない場合は、 sp_send_dbmail 既定のパブリック プロファイルを使用します。 ユーザーの既定のプライベート プロファイルがなく、既定のパブリック プロファイルがない場合は、 sp_send_dbmail エラーを返します。

sp_send_dbmail では、コンテンツのない電子メール メッセージはサポートされません。 電子メール メッセージを送信するには、少なくとも 1 つの@body、@query@file_attachmentsまたは@subjectを指定する必要があります。 それ以外の場合は、 sp_send_dbmail エラーを返します。

データベース メールは、現在のユーザーの Microsoft Windows セキュリティ コンテキストを使用して、ファイルへのアクセスを制御します。 そのため、SQL Server 認証で認証されたユーザーは、@file_attachmentsを使用してファイルを添付できません。 Windows では、SQL Server がリモート コンピューターから別のリモート コンピューターに資格情報を提供することはできません。 そのため、SQL Server が実行されているコンピューター以外のコンピューターからコマンドを実行した場合、データベース メールはネットワーク共有からファイルをアタッチできない可能性があります。

@query@file_attachmentsの両方が指定されていて、ファイルが見つからない場合、クエリは引き続き実行されますが、電子メールは送信されません。

クエリを指定すると、結果セットはインライン テキストとして書式設定されます。 結果セットにあるバイナリ データは 16 進数形式で送信されます。

パラメーター @recipients@copy_recipients、および @blind_copy_recipients は、電子メール アドレスのセミコロン区切りのリストです。 これらのパラメーターのうち少なくとも 1 つを指定するか sp_send_dbmail 、エラーを返す必要があります。

トランザクション コンテキストなしで実行するsp_send_dbmail場合、データベース メールは暗黙的なトランザクションを開始してコミットします。 既存のトランザクション内から実行するsp_send_dbmail場合、データベース メールはユーザーに依存して、変更をコミットまたはロールバックします。 内部トランザクションは開始されません。

アクセス許可

データベース内の DatabaseMailUser データベース ロールのすべてのメンバーに対sp_send_dbmailする既定のmsdb実行アクセス許可。 ただし、メッセージを送信するユーザーに要求のプロファイルを使用するアクセス許可がない場合は、エラーが返され、 sp_send_dbmail メッセージは送信されません。

A. 電子メール メッセージを送信する

この例では、電子メール アドレスを使用して、友人に電子メール メッセージを送信します myfriend@adventure-works.com。 メッセージには件名 Automated Success Messageがあります。 メッセージの本文には、文 The stored procedure finished successfullyが含まれています。

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'Adventure Works Administrator',
    @recipients = 'yourfriend@adventure-works.com',
    @body = 'The stored procedure finished successfully.',
    @subject = 'Automated Success Message';

B. クエリの結果を含む電子メール メッセージを送信する

この例では、電子メール アドレスを使用して、友人に電子メール メッセージを送信します yourfriend@adventure-works.com。 このメッセージには件名 Work Order Countがあり、2022 年 4 月 30 日から 2 日未満の作業指示書 DueDate の数を示すクエリが実行されます。 データベース メール結果をテキスト ファイルとして添付します。

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'Adventure Works Administrator',
    @recipients = 'yourfriend@adventure-works.com',
    @query = 'SELECT COUNT(*) FROM AdventureWorks2022.Production.WorkOrder
                  WHERE DueDate > ''2022-04-30''
                  AND  DATEDIFF(dd, ''2022-04-30'', DueDate) < 2',
    @subject = 'Work Order Count',
    @attach_query_result_as_file = 1;

C: HTML 電子メール メッセージを送信する

この例では、電子メール アドレスを使用して、友人に電子メール メッセージを送信します yourfriend@adventure-works.com。 メッセージには件名 Work Order Listがあり、2022 年 4 月 30 日から 2 日以内の作業指示 DueDate を示す HTML ドキュメントが含まれています。 データベース メールでは、このメッセージが HTML 形式で送信されます。

DECLARE @tableHTML NVARCHAR(MAX);

SET @tableHTML = N'<H1>Work Order Report</H1>' + N'<table border="1">'
    + N'<tr><th>Work Order ID</th><th>Product ID</th>'
    + N'<th>Name</th><th>Order Qty</th><th>Due Date</th>'
    + N'<th>Expected Revenue</th></tr>'
    + CAST((
            SELECT td = wo.WorkOrderID, '',
                td = p.ProductID, '',
                td = p.Name, '',
                td = wo.OrderQty, '',
                td = wo.DueDate, '',
                td = (p.ListPrice - p.StandardCost) * wo.OrderQty
            FROM AdventureWorks.Production.WorkOrder AS wo
            INNER JOIN AdventureWorks.Production.Product AS p
                ON wo.ProductID = p.ProductID
            WHERE DueDate > '2022-04-30'
                AND DATEDIFF(dd, '2022-04-30', DueDate) < 2
            ORDER BY DueDate ASC,
                (p.ListPrice - p.StandardCost) * wo.OrderQty DESC
            FOR XML PATH('tr'),
                TYPE
            ) AS NVARCHAR(MAX))
    + N'</table>';

EXEC msdb.dbo.sp_send_dbmail @recipients = 'yourfriend@adventure-works.com',
    @subject = 'Work Order List',
    @body = @tableHTML,
    @body_format = 'HTML';