Megosztás a következőn keresztül:


sp_send_dbmail (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL Managed Instance

E-mailt küld a megadott címzetteknek. Az üzenet tartalmazhat lekérdezési eredményhalmazt, fájlmellékleteket vagy mindkettőt. Ha a levelek sikeresen bekerülnek az Adatbázisposta üzenetsorba, sp_send_dbmail az üzenet visszaadja az mailitem_id üzenetet. Ez a tárolt eljárás az msdb adatbázisban található.

Transact-SQL szintaxis konvenciók

Szemantika

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 ]
[ ; ]

Arguments

[ @profile_name = ] 'profile_name'

Annak a profilnak a neve, amelyből az üzenetet el szeretné küldeni. A @profile_namesysname típusú, alapértelmezés szerint NULL. A @profile_name egy meglévő adatbázis-levelezési profil nevének kell lennie. Ha nincs megadva @profile_name , sp_send_dbmail az aktuális felhasználó alapértelmezett privát profilját használja. Ha a felhasználó nem rendelkezik alapértelmezett privát profillal, sp_send_dbmail az adatbázis alapértelmezett nyilvános profilját msdb használja. Ha a felhasználó nem rendelkezik alapértelmezett privát profillal, és nincs alapértelmezett nyilvános profil az adatbázishoz, @profile_name kell megadni.

[ @recipients = ] "címzettek"

Pontosvesszővel tagolt e-mail-címek listája az üzenet elküldéséhez. A címzettek listája varchar(max) típusú. Bár ez a paraméter nem kötelező, a @recipients, @copy_recipients vagy @blind_copy_recipients legalább egyikét meg kell adni, vagy sp_send_dbmail hibát ad vissza.

[ @copy_recipients = ] 'copy_recipients'

Pontosvesszővel tagolt e-mail-címek listája, amelybe az üzenetet bemásolhatja. A másolási címzettek listája varchar(max) típusú. Bár ez a paraméter nem kötelező, a @recipients, @copy_recipients vagy @blind_copy_recipients legalább egyikét meg kell adni, vagy sp_send_dbmail hibát ad vissza.

[ @blind_copy_recipients = ] 'blind_copy_recipients'

Pontosvesszővel tagolt lista az e-mail címekről, hogy vak szén-dioxid másolja az üzenetet. A vakmásolat címzettjeinek listája varchar(max) típusú. Bár ez a paraméter nem kötelező, a @recipients, @copy_recipients vagy @blind_copy_recipients legalább egyikét meg kell adni, vagy sp_send_dbmail hibát ad vissza.

[ @from_address = ] 'from_address'

Az e-mail "feladójának" értéke. Ez egy választható paraméter a levelezési profil beállításainak felülbírálásához. Ez a paraméter varchar(max) típusú. Az SMTP biztonsági beállításai határozzák meg, hogy elfogadják-e ezeket a felülbírálásokat. Ha nincs megadva paraméter, az alapértelmezett érték a következő NULL.

[ @reply_to = ] 'reply_to'

Az e-mail "válasz a címre" értéke. Érvényes értékként csak egy e-mail-címet fogad el. Ez egy választható paraméter a levelezési profil beállításainak felülbírálásához. Ez a paraméter varchar(max) típusú. Az SMTP biztonsági beállításai határozzák meg, hogy elfogadják-e ezeket a felülbírálásokat. Ha nincs megadva paraméter, az alapértelmezett érték a következő NULL.

[ @subject = ] N'subject'

Az e-mail tárgya. A tárgy típusa nvarchar(255). Ha nincs megadva tárgy, az alapértelmezett érték az "SQL Server-üzenet".

[ @body = ] N'body'

Az e-mail törzse. Az üzenet törzse nvarchar(max) típusú, alapértelmezett értéke NULL: .

[ @body_format = ] 'body_format'

Az üzenet törzsének formátuma. A paraméter varchar(20) típusú, alapértelmezés szerint NULL. Ha meg van adva, a kimenő üzenet fejlécei úgy vannak beállítva, hogy az üzenet törzse a megadott formátumot tartalmazza. A paraméter a következő értékek egyikét tartalmazhatja:

  • SZÖVEG (alapértelmezett)
  • HTML

[ @importance = ] "fontosság"

Az üzenet fontossága. A paraméter varchar(6) típusú. A paraméter a következő értékek egyikét tartalmazhatja:

  • Low
  • Normal (alapértelmezett)
  • High

[ @sensitivity = ] "bizalmasság"

Az üzenet bizalmassága. A paraméter varchar(12) típusú. A paraméter a következő értékek egyikét tartalmazhatja:

  • Normal (alapértelmezett)
  • Personal
  • Private
  • Confidential

[ @file_attachments = ] N'file_attachments'

Az e-mailhez csatolandó fájlnevek pontosvesszővel tagolt listája. A listában szereplő fájlokat abszolút elérési útként kell megadni. A mellékletek listája nvarchar(max) típusú. Alapértelmezés szerint a Database Mail fájlonként 1 MB-ra korlátozza a fájlmellékleteket.

Fontos

Ez a paraméter nem érhető el a felügyelt Azure SQL-példányban, mert nem fér hozzá a helyi fájlrendszerhez.

[ @query = ] N'query'

Végrehajtandó lekérdezés. A lekérdezés eredményei fájlként csatolhatók, vagy belefoglalhatók az e-mail törzsébe. A lekérdezés nvarchar(max) típusú, és bármilyen érvényes Transact-SQL utasítást tartalmazhat. A lekérdezés végrehajtása külön munkamenetben történik, így a szkripthívás sp_send_dbmail helyi változói nem érhetők el a lekérdezés számára.

A @query paraméter használatakor a végrehajtást végrehajtó sp_send_dbmail tagnak egyéniként kell kapcsolódnia, nem csoport részeként, függetlenül attól, hogy a Microsoft Entra-azonosító (korábbi nevén Azure Active Directory) vagy a Windows Active Directory-csoport. Az SQL Server-bejelentkezések, a Windows-identitások és a Microsoft Entra-identitások végrehajthatják a lekérdezést, de a csoporttagok az Azure SQL Managed Instance megszemélyesítése és az EXECUTE AS korlátozásai miatt nem tudják végrehajtani.

[ @execute_query_database = ] 'execute_query_database'

Az az adatbázis-környezet, amelyen belül a tárolt eljárás futtatja a lekérdezést. A paraméter sysname típusú, az aktuális adatbázis alapértelmezett értékével. Ez a paraméter csak akkor alkalmazható, ha @query van megadva.

[ @attach_query_result_as_file = ] attach_query_result_as_file

Megadja, hogy a lekérdezés eredményhalmaza csatolt fájlként legyen-e visszaadva. @attach_query_result_as_filebit típusú, alapértelmezés szerint 0.

Ha az érték az 0, a lekérdezési eredmények az e-mail törzsébe kerülnek, a @body paraméter tartalma után. Ha az érték az 1, a rendszer mellékletként adja vissza az eredményeket. Ez a paraméter csak akkor alkalmazható, ha @query van megadva.

[ @query_attachment_filename = ] N'query_attachment_filename'

Megadja a lekérdezés mellékletének eredményhalmazához használandó fájlnevet. @query_attachment_filenamenvarchar(255) típusú, alapértelmezett értéke NULL. Ezt a paramétert a rendszer figyelmen kívül hagyja, ha @attach_query_result_as_file.0 Ha @attach_query_result_as_file van 1 , és ez a paraméter, a NULLDatabase Mail tetszőleges fájlnevet hoz létre.

[ @query_result_header = ] query_result_header

Megadja, hogy a lekérdezés eredményei tartalmaznak-e oszlopfejléceket. A query_result_header érték bit típusú. Ha az érték az, a 1lekérdezés eredményei oszlopfejléceket tartalmaznak. Ha az érték az 0, a lekérdezés eredményei nem tartalmaznak oszlopfejléceket. Ez a paraméter alapértelmezés szerint a .1 Ez a paraméter csak akkor alkalmazható, ha @query van megadva.

A @query_result_header beállításakor0 és a @query_no_truncate1beállításakor a következő hiba fordulhat elő:

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

[ @query_result_width = ] query_result_width

A lekérdezés eredményeinek formázásához használt vonalszélesség karakterekben. A @query_result_widthint típusú, alapértelmezés szerint 256. A megadott értéknek az és a 32767közötti 10 értéknek kell lennie. Ez a paraméter csak akkor alkalmazható, ha @query van megadva.

[ @query_result_separator = ] 'query_result_separator'

A lekérdezés kimenetében lévő oszlopok elválasztásához használt karakter. Az elválasztó karakter(1) típusú. Alapértelmezés szerint a (szóköz) értékre van kapcsolva ' ' .

[ @exclude_query_output = ] exclude_query_output

Megadja, hogy a lekérdezés végrehajtásának kimenetét adja-e vissza az e-mailben. @exclude_query_outputbit, alapértelmezés szerint 0. Ha ez a paraméter, 0a sp_send_dbmail tárolt eljárás végrehajtása kinyomtatja a lekérdezés végrehajtásának eredményeként visszaadott üzenetet a konzolon. Ha ez a paraméter, 1a sp_send_dbmail tárolt eljárás végrehajtása nem nyomtatja ki a lekérdezésvégrehajtási üzeneteket a konzolon.

[ @append_query_error = ] append_query_error

Megadja, hogy az e-mailt akkor küldi-e el, amikor hiba jelenik meg a @query argumentumban megadott lekérdezésből. @append_query_errorbit, alapértelmezés szerint 0. Ha ez a paraméter, 1a Database Mail elküldi az e-mailt, és tartalmazza a lekérdezési hibaüzenetet az e-mail törzsében. Ha ez a paraméter, a 0Database Mail nem küldi el az e-mailt, és sp_send_dbmail a sikertelenséget jelző visszatérési kóddal 1végződik.

[ @query_no_truncate = ] query_no_truncate

Megadja, hogy a lekérdezést olyan beállítással kell-e végrehajtani, amely megakadályozza a nagy változóhosszúságú adattípusok (varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image és felhasználó által definiált adattípusok csonkolását. Ha be van állítva, a lekérdezés eredményei nem tartalmaznak oszlopfejléceket. A @query_no_truncateérték bit típusú. Ha az érték meg van 0 adva, vagy nincs megadva, a lekérdezés oszlopai 256 karakterre csonkulnak. Ha az érték az 1, a lekérdezés oszlopai nem csonkulnak. Ez a paraméter alapértelmezés szerint a .0

Megjegyzés:

Nagy mennyiségű adat használata esetén a @query_no_truncate beállítás további erőforrásokat használ fel, és lelassíthatja a kiszolgáló teljesítményét.

[ @query_result_no_padding = ] query_result_no_padding

A típus bit. Az alapértelmezett érték a 0. Ha be 1van állítva, a lekérdezés eredményei nem lesznek kipárnázva, ami csökkentheti a fájlméretet. Ha a @query_result_width paramétert 1 állítja @query_result_no_padding be, a @query_result_no_padding paraméter felülírja a @query_result_width paramétert.

Ebben az esetben nem történik hiba.

A @query_no_truncate @query_result_no_padding1 paraméterének beállításakor és megadásakor a következő hiba léphet fel:

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.

Ha beállítja a @query_result_no_padding1, és beállítja a @query_no_truncate paramétert, hibaüzenet jelenik meg.

[ @mailitem_id = ] mailitem_id [ OUTPUT ]

Az opcionális kimeneti paraméter az mailitem_id üzenet értékét adja vissza. @mailitem_idint típusú.

Kódértékek visszaadása

A sikerességet jelző visszatérési 0 kód. Bármely más érték hibát jelent. A sikertelen utasítás hibakódja a @@ERROR változóban van tárolva.

Eredményhalmaz

A sikeresség esetén a "Levelek üzenetsorba kerül" üzenetet adja vissza.

Megjegyzések

Használat előtt engedélyezni kell az Adatbázisposta szolgáltatást az Adatbázisposta konfigurációs varázslóval vagy sp_configure.

sysmail_stop_sp leállítja a Database Mail szolgáltatást a külső program által használt Service Broker-objektumok leállításával. sp_send_dbmail továbbra is fogadja a leveleket, ha a Database Mail használata sysmail_stop_spleáll. A Database Mail elindításához használja a következőt sysmail_start_sp: .

Ha nincs megadva @profile, sp_send_dbmail egy alapértelmezett profilt használ. Ha az e-mailt küldő felhasználó alapértelmezett privát profillal rendelkezik, a Database Mail ezt a profilt használja. Ha a felhasználó nem rendelkezik alapértelmezett privát profillal, sp_send_dbmail az alapértelmezett nyilvános profilt használja. Ha a felhasználónak nincs alapértelmezett privát profilja, és nincs alapértelmezett nyilvános profilja, sp_send_dbmail hibát ad vissza.

sp_send_dbmail nem támogatja a tartalom nélküli e-mail üzeneteket. E-mail küldéséhez meg kell adnia legalább egy @body, @query, @file_attachments vagy @subject. sp_send_dbmail Ellenkező esetben hibát ad vissza.

A Database Mail az SQL Server szolgáltatásfiókjának biztonsági környezetében fut. Ezért az SQL Server-hitelesítéssel hitelesített felhasználók nem csatolhatnak fájlokat @file_attachments használatával. A Windows nem teszi lehetővé, hogy az SQL Server hitelesítő adatokat adjon meg egy távoli számítógépről egy másik távoli számítógépre. Ezért előfordulhat, hogy a Database Mail nem tud fájlokat csatolni egy hálózati megosztásból olyan esetekben, amikor a parancs az SQL Server által futtatott számítógéptől eltérő számítógépről fut.

Ha @query és @file_attachments is meg van adva, és a fájl nem található, a lekérdezés továbbra is végrehajtásra kerül, de a rendszer nem küldi el az e-mailt.

Ha egy lekérdezés meg van adva, az eredményhalmaz beágyazott szövegként lesz formázva. Az eredmény bináris adatai hexadecimális formátumban lesznek elküldve.

A @recipients, @copy_recipients és @blind_copy_recipients paraméterek pontosvesszőkkel tagolt e-mail-címek. Legalább egy paramétert meg kell adni, vagy sp_send_dbmail hibát ad vissza.

Tranzakciókörnyezet nélkül történő sp_send_dbmail végrehajtáskor a Database Mail elindítja és véglegesíti az implicit tranzakciót. Ha egy meglévő tranzakcióból hajt végre sp_send_dbmail , a Database Mail a felhasználóra támaszkodik a módosítások véglegesítésére vagy visszaállítására. Nem indít el belső tranzakciót.

Permissions

Hajtsa végre az sp_send_dbmail alapértelmezett engedélyeket az adatbázis DatabaseMailUserRole adatbázisszerepkörének minden tagjára msdb . Ha azonban az üzenetet küldő felhasználó nem rendelkezik engedéllyel a profil használatára a kéréshez, hibaüzenetet ad vissza, sp_send_dbmail és nem küldi el az üzenetet.

Példák

A. E-mail küldése

Ez a példa egy e-mail üzenetet küld a barátjának az e-mail cím használatával myfriend@adventure-works.com. Az üzenet tárgya Automated Success Message. Az üzenet törzse tartalmazza a mondatot The stored procedure finished successfully.

EXECUTE 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. E-mail küldése lekérdezés eredményeivel

Ez a példa egy e-mail üzenetet küld a barátjának az e-mail cím használatával yourfriend@adventure-works.com. Az üzenet tárgya Work Order Count, és végrehajt egy lekérdezést, amely a 2022. április 30-a után kevesebb mint két nappal rendelkező munkarendelések DueDate számát jeleníti meg. A Database Mail szövegfájlként csatolja az eredményt.

EXECUTE 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-alapú e-mail küldése

Ez a példa egy e-mail üzenetet küld a barátjának az e-mail cím használatával yourfriend@adventure-works.com. Az üzenet tárgya Work Order Listegy HTML-dokumentum, amely 2022. április 30-tól kevesebb mint két nappal a munkarendeléseket DueDate jeleníti meg. A Database Mail HTML formátumban küldi el az üzenetet.

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>';

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