xp_readmail (Transact-SQL)

Lee un mensaje de correo de la bandeja de entrada de SQL Mail. sp_processmail utiliza este procedimiento para procesar todo el correo de la bandeja de entrada de SQL Mail.

[!NOTA]

Esta característica se quitará en una versión futura de Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

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'
    Es el Id. del mensaje que se va a leer. message_id es de tipo varchar(255) y no tiene ningún valor predeterminado.

  • [ @type = ] 'type'
    Es el tipo del mensaje que se va a devolver, según la definición MAPI:

    IP[ M|C ].Vendorname.subclass

    Si se utiliza como entrada, debe definir el tipo de un mensaje específico; type se omite en la entrada si message_id es NULL. type es de tipo varchar(255) y su valor predeterminado es NULL. SQL Mail admite los tipos de mensajes IPM e IPC.

  • OUTPUT
    Cuando se especifica, coloca el valor del parámetro especificado en el parámetro de salida.

  • [ @peek = ] 'peek'
    Indica si SQL Server devuelve el mensaje de correo sin cambiar su estado a leído. peek es de tipo varchar(5) y su valor predeterminado es FALSE. Si está establecido en FALSE, el correo se trata como si se hubiera leído. Si está establecido en TRUE, el correo se trata como si no se hubiera leído.

  • [ @suppress_attach = ] 'suppress_attach'
    Indica si se suprimen los datos adjuntos del mensaje. suppress_attaches de tipo varchar(255) y su valor predeterminado es FALSE. Si está establecido en TRUE, SQL Server impide la creación de archivos temporales cuando xp_readmail lee un mensaje con datos adjuntos. Si está establecido en FALSE, no se impide la creación de archivos temporales cuando se leen mensajes con datos adjuntos.

  • [ @originator = ] 'sender'
    Es el remitente devuelto del mensaje de correo. senderes de tipo varchar(255) y no tiene ningún valor predeterminado.

  • [ @subject = ] 'subject'
    Es el asunto devuelto del mensaje de correo. subject es de tipo varchar(255) y no tiene ningún valor predeterminado.

  • [ @message = ] 'message'
    Es el cuerpo devuelto o el texto real del mensaje de correo. message es de tipo text y no tiene ningún valor predeterminado.

  • [ @recipients = ] 'recipients [ ;... n] '
    Es la lista, separada por puntos y comas, de los destinatarios del mensaje de correo que se va a devolver. Los nombres de los destinatarios están separados por signos de punto y coma (
    ;
    ). recipient_list es de tipo varchar(255) y no tiene ningún valor predeterminado.

  • [ @cc_list = ] 'copy_recipients [ ;... n] '
    Es la lista, separada por puntos y comas, de los destinatarios de copias (CC:) del mensaje de correo que se va a devolver. Los nombres de los destinatarios están separados por signos de punto y coma (
    ;
    ). cc_list es de tipo varchar(255) y no tiene ningún valor predeterminado.

  • [ @bcc_list = ] 'blind_copy_recipients[ ;... n] '
    Es la lista, separada por signos de punto y coma, de los destinatarios de copias ocultas (CCO:) del mensaje de correo que se va a devolver. Los nombres de los destinatarios están separados por signos de punto y coma (
    ;
    ). bcc_list es de tipo varchar(255) y no tiene ningún valor predeterminado. Si el servidor de correo electrónico no proporciona un valor para el campo CCO, blind_copy_recipients está vacío.

  • [ @date_received = ] 'date'
    Es la fecha devuelta del mensaje de correo. date es de tipo varchar(255) y no tiene ningún valor predeterminado.

  • [ @unread = ] 'unread_value'
    Indica si el mensaje no se ha leído anteriormente (true) o si se ha leído (false). unread_value es de tipo varchar(5) y su valor predeterminado es TRUE.

  • [ @attachments = ] 'attachments [ ;... n] '
    Es la lista, separada por puntos y comas, de las rutas de acceso temporales de los datos adjuntos del mensaje. Las rutas de acceso temporales están separadas por signos de punto y coma (
    ;
    ). attachments es de tipo varchar(255) y no tiene ningún valor predeterminado.

  • [ @skip_bytes = ] bytes_to_skipOUTPUT
    Si se pasa un valor distinto de 0 como entrada, este parámetro especifica el número de bytes que se omitirán antes de leer los siguientes 255 bytes (máximo) del mensaje en el parámetro de salida body_of_message. Cuando se utiliza bytes_to_skip, body_of_message incluye la siguiente parte del mensaje y bytes_to_skip se devuelve con el siguiente punto inicial del mensaje (el valor de bytes_to_skip anterior más la longitud de message). bytes_to_skip es de tipo int y su valor predeterminado es 0.

  • [ @msg_length = ] length_in_bytesOUTPUT
    Es la longitud total del mensaje, en bytes. Cuando se utiliza junto con bytes_to_skip en un procedimiento almacenado, este parámetro permite leer los mensajes en bloques de 255 bytes. length_in_bytes es de tipo int.

  • [ @originator_address = ] 'sender_address'
    Es la dirección de correo resuelta del remitente del mensaje de correo. sender_address es de tipo varchar(255) y no tiene ningún valor predeterminado.

Valores de código de retorno

0 (correcto) o 1 (error)

Conjuntos de resultados

xp_readmail devuelve un conjunto de resultados con las columnas siguientes.

Nombre de columna

Descripción

Originator

Remitente del mensaje de correo electrónico

Date Received

Fecha de recepción del mensaje de correo electrónico

Recipients

Destinatarios a los que se envió el mensaje

CC List

Personas de la línea "CC:" del mensaje de correo electrónico

BCC List

Personas de la línea "CCO:" del mensaje de correo electrónico

Subject

Línea del asunto del mensaje de correo electrónico

Message

Cuerpo del mensaje (texto)

Unread

Si el mensaje no se ha leído

Attachments

Datos adjuntos del mensaje

Message ID

Id. del mensaje

Type

Tipo del mensaje

Notas

Cualquier error, excepto si es un parámetro no válido, queda reflejado en el registro de aplicación de Microsoft Windows.

Hay dos formas de utilizar xp_readmail:

  • Devolver al cliente todos los mensajes de la bandeja de entrada como un conjunto de resultados.

  • Leer un mensaje concreto de la bandeja de entrada.

Para devolver al cliente el contenido de la bandeja de entrada como conjunto de resultados no proporcione parámetros de entrada.

Si no se cambia el valor predeterminado del parámetro suppress_attach a TRUE, se plantean dos posibles riesgos de seguridad en lo que respecta a los datos adjuntos.

  • En primer lugar, si dos usuarios comparten el mismo directorio temporal e inician sesión en el mismo equipo, podrán ver los datos adjuntos de ambos. Para determinar dónde se almacenan los datos adjuntos y si dos usuarios comparten el mismo directorio temporal, revise la variable de salida attachments.

  • En segundo lugar, xp_deletemail no elimina estos datos adjuntos, por lo que deberá eliminarlos uno a uno manualmente.

Para leer un mensaje concreto de la bandeja de entrada, proporcione un message_id válido, devuelto por xp_findnextmsg, como parámetro de entrada de xp_readmail. Puede especificar peek y suppress_attach como parámetros de entrada para controlar la forma en que se lee el mensaje. Cuando se utilizan peek y suppress_attach con este método, los demás parámetros son parámetros de salida opcionales que contienen información específica del mensaje que se va a leer.

Para ver un ejemplo del uso de xp_findnextmsg como parámetro de entrada de xp_readmail, ejecute el siguiente comando:

sp_helptext 'sp_processmail';

Cuando se utiliza para leer un mensaje concreto, xp_readmail puede leer el texto de un mensaje de más de 255 bytes por secciones. Utilice length_in_bytes para leer el texto de un mensaje de más 255 bytes por secciones. El uso de length_in_bytes como parámetro de entrada y salida permite escribir un bucle para procesar todo el texto del mensaje. En el ejemplo de código siguiente se muestra un bucle de estas características, suponiendo que message_id se haya establecido en un identificador de mensaje válido devuelto 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

Permisos

Debe pertenecer a la función fija de servidor sysadmin, pero se pueden conceder permisos EXECUTE a otros usuarios. Sin embargo, por razones de seguridad, se recomienda limitar los permisos para este procedimiento almacenado a los miembros de la función fija de servidor sysadmin.

Ejemplos

En el ejemplo siguiente se devuelve el estado al leer un mensaje. En este ejemplo, se coloca el valor de un Id. de mensaje de xp_findnextmsg en la variable local @message\_id y se pasa a 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