sp_processmail (Transact-SQL)

Utiliza procedimientos almacenados extendidos (xp_findnextmsg, xp_readmail y xp_deletemail) para procesar mensajes de correo entrantes en la bandeja de entrada de Microsoft SQL Server. Se espera que cada mensaje contenga una sola consulta en el cuerpo del mensaje. Este procedimiento utiliza el procedimiento almacenado extendido xp_sendmail para devolver el conjunto de resultados como datos adjuntos al remitente del mensaje.

Nota importanteImportante

Procure no utilizar este procedimiento. El procedimiento sp_processmail procesa la información enviada a usted a través del correo desde un origen desconocido y puede usarse para insertar código malintencionado en su entorno. Examine con cuidado el código antes de ejecutarlo. Este procedimiento se incluye por motivos de compatibilidad con versiones anteriores, pero para instalarlo primero debe habilitar 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

sp_processmail [ [ @subject = ] 'subject' ] 
     [ , [ @filetype = ] 'filetype' ] 
     [ , [ @separator = ] 'separator' ] 
     [ , [ @set_user = ] 'user' ] 
     [ , [ @dbuse = ] 'dbname' ]

Argumentos

  • [ @subject = ] 'subject'
    Es la línea de asunto de los mensajes de correo que se interpretan como consultas para que SQL Server las procese. subject es de tipo varchar(255) y su valor predeterminado es NULL. Cuando se especifica, sp_processmail sólo procesa los mensajes que tienen este asunto. De forma predeterminada, SQL Server procesa todos los mensajes como si los cuerpos de mensaje contuvieran consultas.

  • [ @filetype = ] 'filetype'
    Es la extensión de archivo que se va a utilizar cuando el conjunto de resultados de la consulta se envíe al remitente del mensaje como datos adjuntos. filetype es de tipo varchar(3) y su valor predeterminado es "'txt"'.

  • [ @separator = ] 'separator'
    Es el separador de columnas (terminador de campo) de cada columna del conjunto de resultados. Esta información se pasa al procedimiento almacenado extendido xp_sendmail para devolver el conjunto de resultados al remitente del mensaje. separator es de tipo varchar(3) y su valor predeterminado es 'tab', que es un caso especial del uso del carácter de tabulación entre columnas.

  • [ @set_user = ] 'user'
    Es el contexto de seguridad en el que se debe ejecutar la consulta. user es de tipo varchar(132) y su valor predeterminado es guest.

  • [ @dbuse = ] 'dbname'
    Es el contexto de base de datos en el que se debe ejecutar la consulta. dbname es de tipo varchar(132) y su valor predeterminado es master.

Valores de código de retorno

0 (correcto) o 1 (error)

Conjuntos de resultados

Ninguno

Comentarios

Se espera que los mensajes de correo electrónico entrantes tengan una sola consulta válida de SQL Server como texto del mensaje. sp_processmail sólo procesa mensajes no leídos. Los resultados de la consulta se devuelven al remitente del mensaje y se copian en los usuarios de correo electrónico en la lista CC: (con copia) del mensaje original. Una vez procesados los mensajes, se eliminan de la bandeja de entrada. Si se envía a menudo correo electrónico al servidor, se debe ejecutar sp_processmail frecuentemente. Para configurar el procesamiento regular del correo electrónico, puede utilizar el Agente SQL Server para programar un trabajo sp_processmail. Procesa el correo electrónico con la frecuencia especificada y registra un mensaje informativo que contiene el número de consultas procesadas en el historial del trabajo.

Los resultados se envían como un archivo adjunto. El nombre completo del archivo enviado está compuesto de "Sql" seguido de una cadena aleatoria de números y, a continuación, la extensión de tipo de archivo especificada, por ejemplo, Sql356.txt.

Nota importanteImportante

Para adjuntar un icono apropiado al mensaje de correo, compruebe que el tipo de archivo está asociado correctamente. Para crear una asociación de archivo, haga doble clic en Mi PC en el escritorio y seleccione Opciones de carpeta en el menú Herramientas. En la ficha Tipos de archivo del cuadro de diálogo Opciones de carpeta, especifique la aplicación que se utilizará para abrir el archivo.

Se pueden configurar diferentes trabajos de sp_processmail para realizar consultas en bases de datos diferentes. Por ejemplo, podría adoptar la convención de que las consultas realizadas en la base de datos AdventureWorks2008R2 deben tener un asunto de "SQL:AdventureWorks". A continuación, ejecutaría sp_processmail especificando un asunto (subject) deSQL:AdventureWorks y un nombre de la base de datos (dbname) de AdventureWorks2008R2. Otras consultas y agrupaciones de bases de datos pueden tener otras estructuras de formato. Por ejemplo, las tareas de distribución pueden tener subject con el valor SQL:distribution y dbname con el valor distribution. Cualquiera de ellas puede ser un trabajo programado con el Agente SQL Server.

El procedimiento almacenado del sistema sp_processmail también puede personalizarse de diversos modos al recuperar el texto del procedimiento con el procedimiento almacenado del sistema sp_helptext, modificar el código Transact-SQL y crear un nuevo procedimiento con comportamiento personalizado. Las modificaciones posibles incluyen:

  • Procesar sólo determinados tipos de mensaje personalizados mediante la utilización del parámetro @type con el procedimiento almacenado extendido xp_findnextmsg.

  • Marcar el mensaje como read pero no eliminar el mensaje después de procesarlo (ejecute xp_readmail por segunda vez con peek establecido en false).

  • Enviar los resultados de la consulta en el cuerpo del mensaje de correo electrónico mediante una llamada xp_sendmail con attach_result establecido en false y la eliminación del parámetro attachments.

  • Establecer el contexto de seguridad para ejecutar la consulta en un contexto de usuario basado en el remitente del mensaje. Si los nombres de los usuarios del correo electrónico son los mismos que los de SQL Server, resulta tan sencillo como cambiar la llamada xp_sendmail para que utilice set_user = @originator. Si los nombres de usuario de correo no son nombres de usuario válidos de SQL Server (si, por ejemplo, contienen espacios incrustados), podría hacer una búsqueda en la tabla o una sustitución de caracteres para obtener el nombre de usuario correcto de SQL Server y pasarlo a xp_sendmail.

Permisos

Sólo pueden ejecutar este procedimiento los miembros del rol fijo de servidor sysadmin.

Ejemplos

En el siguiente ejemplo se procesan todos los mensajes de la bandeja de entrada de la base de datos AdventureWorks2008R2. Los conjuntos de resultados se devuelven al cliente en formato CSV (valores separados por comas).

EXEC sp_processmail
    @filetype = 'CSV'
    ,@separator = ','
    ,@dbuse = 'AdventureWorks2008R2';