sp_processmail (Transact-SQL)

使用扩展存储过程(xp_findnextmsgxp_readmailxp_deletemail)处理 Microsoft SQL Server 收件箱中收到的邮件。每封邮件的正文中都应包含单个查询。此过程使用 xp_sendmail 扩展存储过程将结果集以附件形式返回给邮件发送者。

重要说明重要提示

请尽量避免使用此过程。sp_processmail 过程可处理从未知来源通过电子邮件发送给您的信息,并可能将恶意代码引入到您的环境中。执行代码之前,必须谨慎地验证代码。包括此过程是为了向后兼容,但在启用 SQL Mail 之前不会进行安装。

注意注意

后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

主题链接图标Transact-SQL 语法约定

语法

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

参数

  • [ @subject = ] 'subject'
    要将其解释为查询邮件以供 SQL Server 处理的电子邮件的主题行。subject 的数据类型为 varchar(255),默认值为 NULL。指定后,sp_processmail 只处理具有此主题的邮件。默认情况下,SQL Server 会像其邮件正文中包含查询那样处理所有邮件。

  • [ @filetype = ] 'filetype'
    将查询结果集作为附件发送回邮件发件人时使用的文件扩展名。filetype 的数据类型为 varchar(3),默认值为“txt”。

  • [ @separator = ] 'separator'
    结果集中每列的列分隔符(字段终止符)。此信息将传递给扩展存储过程 xp_sendmail,以向邮件发件人返回结果集。separator 的数据类型为 varchar(3),默认值为“tab”,表示在各列之间使用制表符的特殊情况。

  • [ @set_user = ] 'user'
    应在其中运行查询的安全上下文。user 的数据类型为 varchar(132),默认值为 guest。

  • [ @dbuse = ] 'dbname'
    应在其中运行查询的数据库上下文。dbname 的数据类型为 varchar(132),默认值为 master

返回代码值

0(成功)或 1(失败)

结果集

注释

外来电子邮件应以一个单独有效的 SQL Server 查询作为其邮件正文。sp_processmail 只处理未读邮件。查询的结果将返回给邮件发件人,并抄送给原始邮件抄送列表中的所有电子邮件用户。邮件经过处理后,将从收件箱中删除。如果时常有电子邮件发送给服务器,就应经常运行 sp_processmail。若要设置定期的电子邮件处理,可使用 SQL Server 代理来安排 sp_processmail 作业。这样,邮件将按指定的频率处理,并在作业历史记录中记录信息性消息,其中包含已处理的查询数目。

返回结果将作为附件文件发送。所发送文件的完整文件名由 Sql 后加随机数字字符串构成,然后是指定的文件类型扩展名,例如 Sql356.txt。

重要说明重要提示

若要在邮件中附加适当的图标,需确保文件类型的关联正确。若要创建文件关联,请在桌面上双击“我的电脑”,然后从“工具”菜单中选择“文件夹选项”。在“文件夹选项”对话框中的“文件类型”选项卡上,指定用于打开文件的应用程序。

可为不同数据库中的查询设置不同的 sp_processmail 作业。例如,可采用这样的约定:对数据库 AdventureWorks2008R2 的查询的主题必须为“SQL:AdventureWorks”。然后可以运行 sp_processmail,以指定 SQL:AdventureWorks 的 subject 和 AdventureWorks2008R2 的 dbname。其他数据库查询和分组可有其他格式的结构。例如,分发任务可以指定 SQL:distribution 作为 subject,指定distribution 作为 dbname。任何这些任务均可以是 SQL Server 代理安排的作业。

也可以按许多方式自定义 sp_processmail 系统存储过程,方法是用 sp_helptext 系统存储过程检索该过程的正文,然后修改其 Transact-SQL 代码,并使用自定义行为创建新过程。可能的更改包括:

  • 将参数 @typexp_findnextmsg 扩展存储过程结合使用,可以只处理特定的自定义邮件类型。

  • 将邮件标记为 read,但处理(将 peek 设置为 false,然后再次执行 xp_readmail)完邮件之后不将其删除。

  • 调用 xp_sendmail (将 attach_result 设置为 false)并删除参数 attachments,以在电子邮件正文中发送查询结果。

  • 设置安全上下文,以在基于邮件发送者的用户上下文中运行查询。如果电子邮件用户名与 SQL Server 用户名相同,那么此更改将非常简单,只需将调用 xp_sendmail 更改为使用 set_user**=@originator** 即可。如果邮件用户名不是有效的 SQL Server 用户名(例如,如果其中包含嵌入式空格),则可以通过表查找或字符替换来获得适当的 SQL Server 用户名,以传递给 xp_sendmail

权限

只有 sysadmin 固定服务器角色的成员才可以执行这一过程。

示例

以下示例将收件箱中的所有邮件作为 AdventureWorks2008R2 数据库中的查询进行处理。结果集将以 CSV(逗号分隔值)格式返回给客户。

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