sp_send_dbmail (Transact-SQL)

Envia uma mensagem de email aos destinatários especificados. A mensagem pode incluir um conjunto de resultados da consulta, anexos de arquivo ou ambos. Quando o email é colocado com êxito na fila do Database Mail, sp_send_dbmail retorna o mailitem_id da mensagem. Este procedimento armazenado está no banco de dados msdb.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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 ]

Argumentos

  • [ @profile_name= ] 'profile_name'
    É o nome do perfil do qual a mensagem será enviada. O profile_name é do tipo sysname, com um padrão NULL. O profile_name deve ser o nome de um perfil existente do Database Mail. Quando nenhum profile_name é especificado, sp_send_dbmail usa o perfil particular padrão para o usuário atual. Se o usuário não tiver nenhum perfil particular padrão, sp_send_dbmail usará o perfil público padrão para o banco de dados msdb. Se o usuário não tiver um perfil particular padrão e não houver um perfil público padrão para o banco de dados, @profile_name deverá ser especificado.

  • [ @recipients= ] 'recipients'
    É uma lista delimitada por ponto-e-vírgula de endereços de email aos quais a mensagem será enviada. A lista de destinatários é do tipo varchar(max). Embora esse parâmetro seja opcional, pelo menos um dos @recipients, @copy_recipients ou @blind_copy_recipients deve ser especificado, caso contrário, sp_send_dbmail retornará um erro.

  • [ @copy_recipients= ] 'copy_recipients'
    É uma lista delimitada por ponto-e-vírgula de endereços de email aos quais será enviada uma cópia carbono da mensagem. A lista de destinatários de cópia é do tipo varchar(max). Embora esse parâmetro seja opcional, pelo menos um dos @recipients, @copy_recipients ou @blind_copy_recipients deve ser especificado, caso contrário, sp_send_dbmail retornará um erro.

  • [ @blind_copy_recipients= ] 'blind_copy_recipients'
    É uma lista delimitada por ponto-e-vírgula de endereços de email aos quais será enviada uma cópia carbono oculta da mensagem. A lista de destinatários de cópia oculta é do tipo varchar(max). Embora esse parâmetro seja opcional, pelo menos um dos @recipients, @copy_recipients ou @blind_copy_recipients deve ser especificado, caso contrário, sp_send_dbmail retornará um erro.

  • [ @from_address= ] 'from_address'
    É o valor do 'endereço de' da mensagem de email. Esse é um parâmetro opcional usado para substituir as configurações no perfil de email. Esse parâmetro é do tipo varchar(MAX). As configurações de segurança de SMTP determinarão se essas substituições serão aceitas. Se nenhum parâmetro for especificado, o padrão será NULL.

  • [ @reply_to= ] 'reply_to'
    É o valor do 'endereço de responder para' da mensagem de email. Aceita apenas um endereço de email como um valor válido. Esse é um parâmetro opcional usado para substituir as configurações no perfil de email. Esse parâmetro é do tipo varchar(MAX). As configurações de segurança de SMTP determinarão se essas substituições serão aceitas. Se nenhum parâmetro for especificado, o padrão será NULL.

  • [ @subject= ] 'subject'
    É o assunto da mensagem de email. O assunto é do tipo nvarchar(255). Se nenhum assunto for especificado, o padrão será 'SQL Server Message'.

  • [ @body= ] 'body'
    É o corpo da mensagem de email. O corpo da mensagem é do tipo nvarchar(max), com um padrão NULL.

  • [ @body_format= ] 'body_format'
    É o formato do corpo da mensagem. O parâmetro é do tipo varchar(20) com um padrão NULL. Quando especificado, os cabeçalhos da mensagem de saída são definidos para indicar que o corpo da mensagem tem o formato especificado. O parâmetro pode conter um dos seguintes valores:

    • TEXT

    • HTML

    Assume TEXT como padrão.

  • [ @importance= ] 'importance'
    É a importância da mensagem. O parâmetro é do tipo varchar(6). O parâmetro pode conter um dos seguintes valores:

    • Low

    • Normal

    • High

    Assume Normal como padrão.

  • [ @sensitivity= ] 'sensitivity'
    É a sensibilidade da mensagem. O parâmetro é do tipo varchar(12). O parâmetro pode conter um dos seguintes valores:

    • Normal

    • Personal

    • Private

    • Confidential

    Assume Normal como padrão.

  • [ @file_attachments= ] 'file_attachments'
    É uma lista delimitada por ponto-e-vírgula de nomes de arquivo a ser anexada à mensagem de email. Os arquivos da lista devem ser especificados como caminhos absolutos. A lista de anexos é do tipo nvarchar(max). Por padrão, o Database Mail limita os anexos de arquivo a 1 MB por arquivo. Para obter mais informações, consulte Assistente para Configuração do Database Mail.

  • [ @query= ] 'query'
    É uma consulta a ser executada. Os resultados da consulta podem ser anexados a um arquivo ou incluídos no corpo da mensagem de email. A consulta é do tipo nvarchar(max) e pode conter qualquer instrução Transact-SQL válida. Observe que a consulta é executada em uma sessão separada, portanto, as variáveis locais no script que chamam sp_send_dbmail não estão disponíveis para a consulta.

  • [ @execute_query_database= ] 'execute_query_database'
    É o contexto de banco de dados dentro do qual o procedimento armazenado executa a consulta. O parâmetro é do tipo sysname, com um padrão do banco de dados atual. Esse parâmetro só é aplicável se @query for especificado.

  • [ @attach_query_result_as_file= ] attach_query_result_as_file
    Especifica se o conjunto de resultados da consulta for retornada como um arquivo anexo. attach_query_result_as_file é do tipo bit, com um padrão de 0.

    Quando o valor é 0, os resultados da consulta são incluídos no corpo da mensagem de email, depois do conteúdo do parâmetro @body . Quando o valor é 1, os resultados são retornados como um anexo. Esse parâmetro só é aplicável se @query for especificado.

  • [ @query_attachment_filename= ] query_attachment_filename
    Especifica o nome de arquivo a ser usado para o conjunto de resultados do anexo de consulta. query_attachment_filename é do tipo nvarchar(255), com um padrão NULL. Este parâmetro é ignorado quando attach_query_result é 0. Quando attach_query_result é 1 e esse parâmetro é NULL, o Database Mail cria um nome de arquivo arbitrário.

  • [ @query_result_header= ] query_result_header
    Especifica se os resultados da consulta incluem cabeçalhos de coluna. O valor query_result_header é do tipo bit. Quando o valor é 1, os resultados da consulta contêm cabeçalhos de coluna. Quando o valor é 0, resultados da consulta não incluem cabeçalhos de coluna. Esse parâmetro assume 1 como padrão. Esse parâmetro só é aplicável se @query for especificado.

  • [ @query_result_width = ] query_result_width
    É a largura de linha, em caracteres, a ser usada para formatar os resultados da consulta. O query_result_width é do tipo int, com um padrão de 256. O valor fornecido deve estar entre 10 e 32767. Esse parâmetro só é aplicável se @query for especificado.

  • [ @query_result_separator= ] 'query_result_separator'
    É o caractere usado para separar as colunas na saída da consulta. O separador é do tipo char(1). Usa como padrão ' ' (espaço).

  • [ @exclude_query_output= ] exclude_query_output
    Especifica se a saída da execução da consulta será retornada na mensagem de email. exclude_query_output é bit, com um padrão de 0. Quando esse parâmetro é 0, a execução do procedimento armazenado sp_send_dbmail imprime a mensagem retornada como o resultado da execução da consulta no console. Quando esse parâmetro é 1, a execução do procedimento armazenado sp_send_dbmail não imprime nenhuma mensagem de execução de consulta no console.

  • [ @append_query_error= ] append_query_error
    Especifica se deve ser enviado um email quando um erro retornar da consulta especificada no argumento @query. append_query_error é bit, com um padrão de 0. Quando esse parâmetro é 1, o Database Mail envia a mensagem de email e inclui a mensagem de erro de consulta no corpo da mensagem de email. Quando esse parâmetro é 0, o Database Mail não envia a mensagem de email e sp_send_dbmail encerra com o código de retorno 1, indicando falha.

  • [ @query_no_truncate= ] query_no_truncate
    Especifica se a consulta deve ser executada com a opção que evita truncamento de tipos de dados de comprimento de variável grande (varchar(max), nvarchar(max), varbinary(max), xml, text, ntext, image e tipos de dados definidos pelo usuário). Quando definido, os resultados da consulta não incluem cabeçalhos de coluna. O valor de query_no_truncate é do tipo bit. Quando o valor é 0 ou não especificado, as colunas na consulta são truncadas com 256 caracteres. Quando o valor é 1, as colunas da consulta não são truncadas. Esse parâmetro assume 0 como padrão.

    ObservaçãoObservação

    Quando usado com grandes quantidades de dados, a opção @query_no_truncate consome recursos adicionais e pode reduzir o desempenho do servidor.

  • [ @query_result_no_padding ] @query_result_no_padding
    O tipo é bit. O padrão é 0. Quando você o define como 1, os resultados da consulta não são preenchidos, possivelmente reduzindo o tamanho do arquivo. Se você definir @query_result_no_padding como 1 e definir o parâmetro @query_result_width, o parâmetro @query_result_no_padding substituirá o parâmetro @query_result_width.

    Nesse caso, não ocorre nenhum erro.

    Se você definir o @query_result_no_padding como 1 e definir o parâmetro @query_no_truncate, será gerado um erro.

  • [ @mailitem_id= ] mailitem_id [ OUTPUT ]
    O parâmetro de saída opcional retorna o mailitem_id da mensagem. O mailitem_id é do tipo int.

Valores de código de retorno

Um código de retorno de 0 significa êxito. Qualquer outro valor significa falha. O código de erro da instrução com falha é armazenado na variável @@ERROR.

Conjuntos de resultados

Com êxito, retorna a mensagem "Email enfileirado".

Comentários

Antes de ser usado, o Database Mail deve ser habilitado no Assistente para Configuração do Database Mail ou usando sp_configure.

sysmail_stop_sp interrompe o Database Mail, interrompendo os objetos do Service Broker que o programa externo usa. sp_send_dbmail continua a aceitar email quando o Database Mail é interrompido usando sysmail_stop_sp. Para iniciar o Database Mail, use sysmail_start_sp.

Quando @profile não é especificado, sp_send_dbmail usa um perfil padrão. Se o usuário que envia a mensagem de email tiver um perfil particular padrão, o Database Mail irá utilizá-lo. Se o usuário não tiver nenhum perfil particular padrão, o sp_send_dbmail usará o perfil público padrão. Se não houver nenhum perfil particular padrão para o usuário e nenhum perfil público padrão, o sp_send_dbmail retornará um erro.

sp_send_dbmail não aceita mensagens de email sem conteúdo. Para enviar uma mensagem de email, é necessário especificar pelo menos um @body, @query, @file_attachments ou @subject. Caso contrário, sp_send_dbmail retornará um erro.

O Database Mail usa o contexto de segurança do usuário atual do Microsoft Windows para controlar o acesso a arquivos. Portanto, os usuários autenticados com a Autenticação do SQL Server não podem anexar arquivos usando @file_attachments. O Windows não permite que o SQL Server forneça credenciais de um computador remoto para outro. Portanto, o Database Mail pode não conseguir anexar arquivos de um compartilhamento de rede caso o comando seja executado de um computador diferente daquele em que o SQL Server é executado.

Se @query e @file_attachments forem especificados e o arquivo não for localizado, a consulta ainda será executada mas o email não será enviado.

Quando uma consulta é especificada, o conjunto de resultados é formatado como texto em linha. Dados binários no resultado são enviados em formato hexadecimal.

Os parâmetros @recipients, @copy_recipients e @blind_copy_recipients são listas delimitadas por ponto-e-vírgula de endereços de email. Pelo menos um desses parâmetros deve ser fornecido ou sp_send_dbmail retornará um erro.

Ao executar sp_send_dbmail sem um contexto de transação, o Database Mail inicia e confirma uma transação implícita. Ao executar sp_send_dbmail de uma transação existente, o Database Mail depende do usuário para confirmar ou reverter qualquer alteração. Ele não inicia uma transação interna.

Permissões

Permissões de execução para sp_send_dbmail assumem como padrão todos os membros da função de banco de dados DatabaseMailUser no banco de dados msdb. Entretanto, quando o usuário que está enviando a mensagem não tem permissão para usar o perfil para a solicitação, sp_send_dbmail retorna um erro e não envia a mensagem.

Exemplos

A. Enviando uma mensagem de email

Este exemplo envia uma mensagem de email a Dan Wilson usando o endereço de email danw@Adventure-Works.com. O assunto da mensagem é Automated Success Message. O corpo da mensagem contém a sentença 'The stored procedure finished successfully'.

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

B. Enviando uma mensagem de email com os resultados de uma consulta

Este exemplo envia uma mensagem de email a Dan Wilson usando o endereço de email danw@Adventure-Works.com. O assunto da mensagem é Work Order Count e executa uma consulta que mostra o número de ordens de trabalho com uma DueDate menor que dois dias, após 30 de abril de 2004. O Database Mail anexa o resultado como um arquivo de texto.

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

C. Enviando uma mensagem de email HTML

Este exemplo envia uma mensagem de email a Dan Wilson usando o endereço de email danw@Adventure-Works.com. O assunto da mensagem é Work Order List e contém um documento HTML que mostra o número de ordens de trabalho com uma DueDate menor que dois dias, após 30 de abril de 2004. O Database Mail envia a mensagem no formato 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 AdventureWorks2008R2.Production.WorkOrder as wo
              JOIN AdventureWorks2008R2.Production.Product AS p
              ON wo.ProductID = p.ProductID
              WHERE DueDate > '2006-04-30'
                AND DATEDIFF(dd, '2006-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='danw@Adventure-Works.com',
    @subject = 'Work Order List',
    @body = @tableHTML,
    @body_format = 'HTML' ;