Transact-SQL 参考

xp_readmail

阅读 Microsoft® SQL Server™ 邮件收件箱中的邮件。sp_processmail 使用此过程处理 SQL Server 收件箱中的所有邮件。

语法

xp_readmail [[@msg_id =] 'message_number']
    [, [@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]]

参数

[@msg_id =] 'message_number'

是要阅读的邮件的编号。message_number 的数据类型为 varchar(255),无默认值。

'type'

是基于以下 MAPI 邮件定义返回的邮件类型:

IP[M | C].Vendorname.subclass

如果用于输入,则此参数必须定义特定邮件的类型;如果 message_number 为 NULL,则忽略输入的 typetype 的数据类型为 varchar(255),其默认值为 NULL。

OUTPUT

如果指定,则将指定参数值置于输出参数中。

[@peek =] 'peek'

是否 SQL Server 返回邮件而不更改要阅读邮件的状态。peek 的数据类型为 varchar(5),其默认值为 FALSE。如果设置为 false,则将邮件视为"已读"。如果设置为 true,则将邮件视为"未读"。

[@suppress_attach =] 'suppress_attach'

是否忽略邮件附件。suppress_attach 的数据类型为 varchar(255),其默认值为 TRUE(不创建临时文件)。如果设置为 true,则 SQL Server 禁止在 xp_readmail 阅读带附件邮件时创建临时文件。如果设置为 false,则不禁止在阅读带附件邮件时创建临时文件。

[@originator =] 'sender'

是返回的发件人邮件地址。sender 的数据类型为 varchar(255),无默认值。

[@subject =] 'subject'

是返回的邮件主题。subject 的数据类型为 varchar(255),无默认值。

[@message =] 'message'

是所返回邮件的正文或实际文本。message 的数据类型为 text,无默认值。

[@recipients =] 'recipients [;...n]'

是要返回的邮件的收件人列表,该列表以分号分隔。收件人名称之间用分号 (;) 分隔。recipient_list 的数据类型为 varchar(255),无默认值。

[@cc_list =] 'copy_recipients [;...n]'

是要返回的邮件的复本收件人(抄送人)列表,该列表以分号分隔。收件人名称之间用分号 (;) 分隔。cc_list 的数据类型为 varchar(255),无默认值。

[@bcc_list =] 'blind_copy_recipients [;...n]'

是要返回的邮件的密件复本收件人(密件抄送人)列表,该列表以分号分隔。收件人名称之间用分号 (;) 分隔。bcc_list 的数据类型为 varchar(255),无默认值。

[@date_received =] 'date'

是邮件的返回日期。date 的数据类型为 varchar(255),无默认值。

[@unread =] 'unread_value'

邮件以前是未读 (true) 还是已读 (false) 的。unread_value 的数据类型为 varchar(5),其默认值为 TRUE。

[@attachments =] 'attachments [;...n]'

是返回的邮件附件临时路径的列表,该列表以分号分隔。临时路径以分号 (;) 分隔。attachments 的数据类型为 varchar(255),无默认值。

[@skip_bytes =] bytes_to_skip OUTPUT

如果输入的值不为 0,则此参数指定在将邮件的下 255 个字节(最大字节数)读入 body of message 输出参数之前要跳过的字节数。如果使用 bytes_to_skip,则 body_of_message 包含邮件的下一部分,并且 bytes_to_skip 返回邮件中的下一个起始点(前一 bytes_to_skip 加上 message 的长度)。bytes_to_skip 的数据类型为 int,其默认值为 0。

[@msg_length =] length_in_bytes OUTPUT

邮件的总长度(以字节为单位)。在存储过程中与 bytes_to_skip 协同使用时,此参数允许以 255 个字节为单位阅读邮件。length_in_bytes 的数据类型为 int,其默认值为 255(字节)。

[@originator_address =] 'sender_address'

已解析的邮件发出人的邮件地址。sender_addressvarchar(255),无默认值。

返回代码值

0(成功)或 1(失败)

结果集

xp_readmail 返回包含下面这些列的结果集(较旧邮件首先出现)。

列名 描述
Originator 电子邮件的发件人
Date Received 电子邮件的接收日期
Recipients 邮件的接收者
CC List 电子邮件"抄送"行中的人员
BCC List 电子邮件"密件抄送"行中的人员
Subject 电子邮件的主题行
Message 邮件的正文(文本)
Unread 该邮件是否未读
Attachments 邮件的任何附件
Message ID 邮件ID
Type 邮件类型

注释

除无效参数外的任何失败均记入 Microsoft Windows NT® 应用程序日志。

使用 xp_readmail 有两种方法:

若要将收件箱内容作为结果集返回客户端,则应将 message_number 设置为 NULL 或不包含 message_number。在这种情况下,可使用 type 来阅读特定的邮件。可以将 peeksuppress_attach 指定为输入参数,以控制阅读邮件的方式。

若要阅读收件箱中的单封邮件,应将 xp_findnextmsg 所返回的有效 message_number 提供给 xp_readmail 作为输入参数。可以将 peeksuppress_attach 指定为输入参数,以控制阅读邮件的方式。如果以这种方式使用 peeksuppress_attach,所有其它参数都是可选的输出参数,其中包含要阅读的邮件中的特定信息。

通过执行下面命令,可以查看将 xp_findnextmsg 用作 xp_readmail 的输入参数的示例:

sp_helptext 'sp_processmail'

用于阅读单封邮件时,xp_readmail 可以通过逐段阅读的方式阅读多于 255 个字节的邮件文本。使用 length_in_byteslength_in_bytes 逐段阅读多于 255 个字节的邮件文本。将 length_in_bytes 既作为输入参数又作为输出参数,可以编写循环代码,以处理整个邮件的文本。下列代码显示了这种循环的示例(假定 message_number 设置为 xp_findnextmsg 所返回的有效邮件标识符)。

USE master
WHILE (1 = 1)
BEGIN
EXEC @status = xp_readmail @msg_id = @msg_id,
   @message = @message OUTPUT,
   @skip_bytes = @skip_bytes OUTPUT,
   @msg_length = @msg_length OUTPUT

IF @status <> 0 BREAK
SELECT 'msg_id' = @msg_id, 'msg_part' = @message
IF @skip_bytes = @msg_length BREAK
END
权限

xp_readmail 的执行权限默认授予 master 数据库中的 db_owner 固定数据库角色成员以及 sysadmin 固定服务器角色成员,但可以授予其他用户。

示例

下例在阅读邮件时返回状态。在下例中,xp_findnextmsg 所返回的邮件ID 放置于局部变量 @message_id 中并传递给 xp_readmail

USE master
EXEC @status = xp_readmail @msg_id = @message_id,
   @originator = @originator OUTPUT,
   @cc_list = @cc_list OUTPUT,
   @subject = @msgsubject OUTPUT,
   @message = @query OUTPUT,
   @peek = 'TRUE',
   @suppress_attach = 'TRUE'

请参见

sp_processmail

系统存储过程(SQL 邮件扩展过程)

xp_deletemail

xp_findnextmsg

xp_sendmail

xp_startmail

xp_stopmail