xp_readmail (Transact-SQL)
Lê um email da caixa de entrada do SQL Mail. Este procedimento é usado por sp_processmail para processar todo o correio na caixa de entrada do SQL Mail.
Observação |
---|
Esse recurso será removido em uma versão futura do Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam. |
Sintaxe
xp_readmail [ [ @msg_id= ] 'message_id' ]
[ , [ @type= ] 'type' [ OUTPUT ] ]
[ , [ @peek= ] 'peek' ]
[ , [ @suppress_attach= ] 'suppress_attach' ]
[ , [ @originator= ] 'sender' OUTPUT ]
[ , [ @subject= ] 'subject' OUTPUT ]
[ , [ @message= ] 'message' OUTPUT ]
[ , [ @recipients= ] 'recipients [ ;...n ]' OUTPUT ]
[ , [ @cc_list= ] 'copy_recipients [ ;...n ]' OUTPUT ]
[ , [ @bcc_list= ] 'blind_copy_recipients [ ;...n ]' OUTPUT ]
[ , [ @date_received= ] 'date' OUTPUT ]
[ , [ @unread= ] 'unread_value' OUTPUT ]
[ , [ @attachments= ] 'attachments [ ;...n ]' OUTPUT ])
[ , [ @skip_bytes= ] bytes_to_skip OUTPUT ]
[ , [ @msg_length= ] length_in_bytes OUTPUT ]
[ , [ @originator_address= ] 'sender_address' OUTPUT ] ]
Argumentos
[ @msg_id = ] 'message_id'
É o ID da mensagem a ser lida. message_id é varchar(255), sem padrão.[ @type = ] 'type'
É o tipo de mensagem a ser retornada com base na definição de MAPI:IP[ M|C ].Vendorname.subclass
Se for usado na saída, deverá definir o tipo de uma mensagem específica; type será ignorado na saída se message_id for NULL. type é varchar(255), com um padrão NULL. O SQL Mail oferece suporte aos tipos de mensagem IPM e IPC.
OUTPUT
Quando for especificado, coloca o valor do parâmetro especificado no parâmetro de saída.[ @peek = ] 'peek'
É o fato de o SQL Server retornar o email sem alterar o status para lido. peek é varchar(5), com um padrão FALSE. Se for definido como FALSE, o correio será tratado como se tivesse sido lido. Se for definido como TRUE, o correio será tratado como se não tivesse sido lido.[ @suppress_attach = ] 'suppress_attach'
É o fato de os anexos de correio serem suprimidos. suppress_attaché varchar(255), com um padrão FALSE. Se for definido como TRUE, o SQL Server impedirá a criação de arquivos temporários quando xp_readmail ler uma mensagem com anexos. Se for definido como FALSE, não há prevenção de arquivos temporários quando forem lidas mensagens com anexos.[ @originator = ] 'sender'
É o remetente do correio retornado. senderé varchar(255), sem padrão.[ @subject = ] 'subject'
É o assunto retornado do email. subject é varchar(255), sem padrão.[ @message = ] 'message'
É o corpo retornado ou o texto real do email. message é text, sem padrão.[ @recipients = ] 'recipients [ ;... n] '
É a lista separada por ponto-e-vírgula dos destinatários do email a ser retornado. Os nomes de destinatários são separados por um ponto-e-vírgula (;). recipient_list é varchar(255), sem padrão.[ @cc_list = ] 'copy_recipients [ ;... n] '
É a lista separada por ponto-e-vírgula dos destinatários no campo Cc do email a ser retornado. Os nomes de destinatários são separados por um ponto-e-vírgula (;). cc_list é varchar(255), sem padrão.[ @bcc_list = ] 'blind_copy_recipients[ ;... n] '
É a lista separada por ponto-e-vírgula dos destinatários no campo Cco do email a ser retornado. Os nomes de destinatários são separados por um ponto-e-vírgula (;). bcc_list é varchar(255), sem padrão. Se o servidor de email não fornecer um valor para o campo Cco, blind_copy_recipients estará vazio.[ @date_received = ] 'date'
É a data de retorno do email. date é varchar(255), sem padrão.[ @unread = ] 'unread_value'
É o fato de uma mensagem ter sido lida anteriormente (true) ou não (false). unread_value é varchar(5), com um padrão TRUE.[ @attachments = ] 'attachments [ ;... n] '
É a lista separada por ponto-e-vírgula dos caminhos temporários retornados dos anexos de correio da mensagem. Os caminhos temporários são separados por um ponto-e-vírgula (;). attachments é varchar(255), sem padrão.[ @skip_bytes = ] bytes_to_skipOUTPUT
Se um valor diferente de 0 for passado para a entrada, este parâmetro especificará o número de bytes a serem ignorados antes de ler os próximos 255 bytes (máx.) da mensagem no parâmetro de saída body_of_message. Quando bytes_to_skip for usado, body_of_message incluirá a próxima parte da mensagem e bytes_to_skip será retornado com o próximo ponto inicial da mensagem (o bytes_to_skip anterior mais o comprimento da message). bytes_to_skip é int, com um padrão 0.[ @msg_length = ] length_in_bytesOUTPUT
É o comprimento total da mensagem, em bytes. Quando for usado com bytes_to_skip em um procedimento armazenado, este parâmetro permite que mensagens sejam lidas em blocos de 255 bytes. length_in_bytes é int.[ @originator_address = ] 'sender_address'
É o endereço de correio resolvido do originador do email. sender_address é varchar(255), sem padrão.
Valores de código de retorno
0 (êxito) ou 1 (falha)
Conjuntos de resultados
xp_readmail retorna um conjunto de resultados com estas colunas.
Nome da coluna |
Descrição |
---|---|
Originador |
Remetente de mensagem de email |
Data do recebimento |
Data em que a mensagem de email foi recebida |
Destinatários |
As pessoas para quem a mensagem foi enviada |
Lista Cc |
As pessoas na linha "Cc:" da mensagem de email |
Lista Cco |
As pessoas na linha "Cco:" da mensagem de email |
Assunto |
A linha de assunto da mensagem de email. |
Mensagem |
Corpo da mensagem (texto) |
Não lido |
Se esta mensagem não foi lida |
Anexos |
Qualquer anexo da mensagem |
ID da mensagem |
ID da mensagem |
Tipo |
Tipo de mensagem |
Comentários
Qualquer falha, com exceção de um parâmetro inválido, será registrada no log de aplicativos do Microsoft Windows.
Há dois modos de usar xp_readmail:
Retornar todas as mensagens da caixa de entrada como um conjunto de resultados para o cliente.
Ler uma única mensagem da caixa de entrada.
Para retornar o conteúdo da caixa de entrada como um conjunto de resultados para o cliente, não forneça nenhum parâmetro de entrada.
A falha em alterar o padrão do parâmetro suppress_attach para TRUE gera dois problemas potenciais de segurança para anexos.
Primeiro, se dois usuários diferentes compartilharem o mesmo diretório temporário e efetuarem logon no mesmo computador, eles poderão exibir os anexos um do outro. É possível determinar onde os anexos são armazenados e se dois usuários compartilham o mesmo diretório temporário recuperando-se a variável de saída attachments.
Segundo, xp_deletemail não exclui estes anexos, assim você deve excluir cada anexo manualmente.
Para ler uma única mensagem da caixa de entrada, forneça um message_id válido retornado por xp_findnextmsg como um parâmetro de entrada para xp_readmail. Você pode especificar peek e suppress_attach como parâmetros de entrada a fim de controlar o modo que a mensagem é lida. Ao usar peek e suppress_attach com este método, todos os demais parâmetros são parâmetros de saía opcionais que contêm informações específicas da mensagem a ser lida.
Você pode exibir um exemplo de uso de xp_findnextmsg como um parâmetro de entrada para xp_readmail executando o seguinte comando:
sp_helptext 'sp_processmail';
Quando for usado para ler uma única mensagem, xp_readmail pode ler texto de mensagem com mais de 255 bytes nas seções. Use length_in_bytes para ler texto de mensagem com mais de 255 bytes nas seções. O uso de length_in_bytes como um parâmetro de entrada e um parâmetro de saída permite a codificação de um loop para processar o texto da mensagem inteira. O código a seguir mostra um exemplo de um loop desse tipo, supondo que message_id esteja definido como um identificador de mensagem válido retornado por xp_findnextmsg.
USE master;
GO
-- Set up variables.
DECLARE @status INT,
@message_part VARCHAR(255),
@msg_id VARCHAR(255),
@message_length INT,
@skip_bytes INT,
@message VARCHAR(MAX) ;
-- Find the next message
EXEC @status = dbo.xp_findnextmsg
@msg_id = @msg_id OUTPUT ;
-- If xp_findnextmsg completed successfully and
-- there is a message in the inbox, read the message.
IF (@status = 0 AND @msg_id IS NOT NULL)
BEGIN
WHILE (1=1)
BEGIN
EXEC @status = dbo.xp_readmail
@msg_id = @msg_id,
@msg_length = @message_length OUTPUT,
@skip_bytes = @skip_bytes OUTPUT,
@message = @message_part OUTPUT ;
IF @status <> 0 BREAK ;
SET @message = ISNULL(@message, '') + @message_part ;
PRINT @message_length ;
PRINT @skip_bytes;
IF @message_length = @skip_bytes BREAK ;
END ;
IF @status = 0
BEGIN
SELECT 'Message ID' = @msg_id, 'Message Body' = @message ;
END ;
ELSE
SELECT 'Could not read message.' ;
END;
GO
Permissões
Requer associação na função de servidor fixa sysadmin, mas permissões EXECUTE podem ser concedidas a outros usuários. Mas, por razões de segurança, é recomendável que as permissões desse procedimento armazenado sejam limitadas aos membros da função de servidor fixa sysadmin.
Exemplos
O exemplo a seguir retorna o status ao ler uma mensagem. Neste exemplo, o valor de um ID de mensagem de xp_findnextmsg é colocado na variável local @message_id e passado para xp_readmail.
USE master ;
GO
DECLARE @status INT,
@msg_id VARCHAR(255),
@originator VARCHAR(255),
@cc_list VARCHAR(255),
@subject VARCHAR(255),
@query VARCHAR(8000);
-- Find the next message
EXEC @status = dbo.xp_findnextmsg
@msg_id = @msg_id OUTPUT ;
-- If xp_findnextmsg completed successfully and
-- there is a message in the inbox, read the message.
IF (@status = 0 AND @msg_id IS NOT NULL)
BEGIN
EXEC @status = dbo.xp_readmail
@msg_id = @msg_id,
@originator = @originator OUTPUT,
@cc_list = @cc_list OUTPUT,
@subject = @subject OUTPUT,
@message = @query OUTPUT,
@peek = 'TRUE',
@suppress_attach = 'TRUE'
END;
GO