sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man skickar e-post från SQL Server (T-SQL)

SQL Server ger möjlighet att skicka e-post via sin Database Mail-lösning.

Själva handlingen att skicka e-post görs med sp_send_dbmail lagrad procedur. Men innan du börjar skicka e-post från SQL Server måste du aktivera och konfigurera Databas Mail.

Du kan göra detta med SSMS GUI eller med T-SQL.

Den här artikeln visar hur man gör det med T-SQL. Den förutsätter att Database Mail aldrig har aktiverats på ditt system, och därför går den igenom stegen för att aktivera den.

Om du föredrar att använda SSMS GUI, se Hur man ställer in databaspost i SQL Server (SSMS).

Steg 1:Aktivera Database Mail XPs

Det första du behöver göra innan du skickar e-post från SQL Server är att aktivera Database Mails utökade lagrade procedurer (Database Mail XPs). Dessa finns i msdb systemdatabas.

Detta kräver också att "visa avancerade alternativ" är aktiverat.

Dessa är inaktiverade som standard. Så om du aldrig har använt Database Mail på ditt system tidigare, måste du aktivera dem.

Så här aktiverar du avancerade alternativ och Database Mail XP:

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

Det finns inget behov av att starta om SQL Server. Database Mail XPs bör nu vara tillgängliga att använda.

Microsoft rekommenderar faktiskt att avancerade alternativ som detta endast bör ändras av en erfaren databasadministratör eller certifierad SQL Server-tekniker, men för syftet med denna artikel antar jag att du är en erfaren DB-administratör som fräschar upp ditt minne 😉

I alla fall för att köra sp_configure med båda parametrarna för att ändra ett konfigurationsalternativ eller för att köra RECONFIGURE uttalande måste du tilldelas ALTER SETTINGS behörighet på servernivå. ALTER SETTINGS behörighet innehas implicit av sysadmin och serveradmin fasta serverroller.

Steg 2:Skapa ett e-postkonto och en profil

Databasmail skickas via en profil snarare än ett användarkonto direkt.

För att skicka e-post med Database Mail måste du skapa ett Database Mail-konto, en Database Mail-profil, lägga till kontot i profilen och sedan ge en användare åtkomst till den profilen. Användaren måste vara på msdb databas.

T-SQL-koden för att göra detta kan se ut ungefär så här:

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

Du måste ersätta de olika detaljerna med dina egna. Detta förutsätter också att du anger en e-postserver som fungerar, och att du använder rätt port.

Observera att jag redan hade en inloggning som heter Marge på min server. Här skapade jag en användare på msdb databas för den inloggningen. Sedan i den sista delen gav jag den användaren åtkomst till profilen som jag just skapade.

I det här exemplet skapade jag ett Databas Mail-konto och la till det i profilen. Du kan lägga till flera konton till en profil om du vill. Detta kan vara användbart som en failover när du skickar e-post. Om det första kontot misslyckas kommer det att försöka med nästa, och nästa, och så vidare.

När du har fått koden ovan (med dina egna uppgifter) bör du kunna skicka e-post.

Steg 3:Skicka e-post

Som nämnts görs själva sändningen av e-post med sp_send_dbmail lagrad procedur.

Här är ett exempel:

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

Det här är ett enkelt e-postmeddelande med bara grunderna som mottagaren, ämnesraden, e-postmeddelandet osv.

Om du inte anger en profil kommer proceduren att använda den privata standardprofilen för den aktuella användaren. Om det inte finns någon privat standardprofil för användaren kommer den att använda den offentliga standardprofilen för msdb databas. Om det inte finns någon offentlig standardprofil får du ett felmeddelande.

Fler alternativ

sp_send_dbmail proceduren accepterar en hel del fler argument än vad jag har använt i det här exemplet.

Här är den officiella syntaxen för sp_send_dbmail procedur:

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 ]

Se Microsofts dokumentation för en detaljerad förklaring av varje argument.

E-postreferens för databaser

Se Databas Mail Tutorials för en omfattande lista över Databas Mail Tutorials. Detta kan vara en bra referens, eftersom varje handledning handlar om en specifik del av Database Mail.


  1. Producera DISTINCT-värden i STRING_AGG

  2. Komma igång med SQLite Full-text Search

  3. MySQL paginering utan dubbelfråga?

  4. Vad kan Query Plan berätta?