自动完成流

适用于:Outlook 2013 | Outlook 2016

除了知道 Microsoft Outlook 如何与自动完成流交互之外,还必须了解自动完成流的二进制格式。

自动完成流是一组收件人属性行,它们与仅由 Microsoft Outlook 2013、Microsoft Outlook 2010、Microsoft Office Outlook 2007 和 Microsoft Outlook 2003 使用的一些记帐元数据一起保存为二进制流。 元数据与 Outlook 与自动完成流的交互相关,因此第三方在保存修改后的自动完成流时必须保留每个元数据块中的内容。 换句话说,第三方应仅修改二进制格式的行集部分,并保留自动完成流的元数据块中已有的内容。

Stream可视化

自动完成流的高级布局如下所示:

元数据 (4 个字节)

主版本号 (4 个字节)

次要版本号 (4 个字节)

行数 n (4 个字节)

第一行中的属性 p 数 (4 个字节)

属性 1 的属性标记 (4 个字节)

属性 1 的保留数据 (4 个字节)

属性 1 的值联合 (8 个字节)

属性 1 的值数据 (0 或可变字节)

… (属性 2 到属性 P-1)

属性 p 的属性标记 (4 个字节)

属性 p 的保留数据 (4 个字节)

属性 p 的值联合 (8 个字节)

属性 p 的值数据 (0 或可变字节)

第二行中的属性 q 数 (4 个字节)

… (第二行的属性)

… (第 3 行到第 n-1 行)

第 n 行中的属性 r 数 (4 个字节)

… (行 n 的属性)

额外的信息字节计数 EI (4 个字节)

) (EI 字节的额外信息

元数据 (8 个字节)

有关二进制结构的示例,请参阅 Outlook 2003/2007 NK2 文件格式和开发人员指南中的二进制示例。

高级布局

概括而言,自动完成流的布局如下:

值数据 字节数
Metadata
4
主版本号
4
次要版本号
4
行集
变量
额外信息字节计数 EI
4
额外信息
Ei
Metadata
8

读取此流时,如果主版本不同于 12,则不应读取或写入此流。 自动完成流的当前次要版本为 0,其额外信息字节计数设置为 0。 如果次要版本不同于 0,则在读取流时需要读取的额外信息中会存在信息,并在写入流时保留这些信息。 写入流时,还需要保留次要版本。 如果不保留这两个,写入额外信息的 Outlook 实例将丢失数据。

注意

应用程序不得向“额外信息”字段添加自定义数据或更改次要版本,因为此功能支持格式的 Outlook 扩展,而不是支持任意第三方扩展。

行集布局

行集布局如下所示:

值数据 字节数
行数
4
Rows
变量

行数标识二进制流序列的下一部分有多少行。

行布局

每行采用以下格式:

值数据 字节数
属性数
4
属性
变量

属性数标识二进制流序列的下一部分有多少属性。

属性布局

每个属性都采用以下格式:

值数据 字节数
属性标记
4
保留的数据
4
属性值联合
数值数据
0 或变量 (,具体取决于 prop 标记)

解释属性值

属性值联合和值数据将根据属性块的前 4 个字节中的属性标记进行解释。 此属性标记的格式与 MAPI 属性标记的格式相同。 属性标记的位 0 到 15 是属性的类型。 位 16 到 31 是属性的标识符。 属性类型确定应如何读取属性的其余部分。

静态值

某些属性没有值数据,并且只有联合中的数据。 来自属性标记) 的以下属性类型 (应按如下所示解释 8 字节属性联合数据:

属性类型 属性联合解释
PT_I2
short int
PT_LONG
long
PT_ERROR
long
PT_R4
float
PT_DOUBLE
double
PT_BOOLEAN
short int
PT_SYSTIME
FILETIME
PT_I8
LARGE_INTEGER

动态值

其他属性在包含属性标记、保留数据和属性值联合的前 16 个字节之后的 Value Data 块中包含数据。 与静态值不同,存储在 8 字节属性值联合中的数据在读取时不相关。 写入时,请确保用内容填充这 8 个字节。 但是,8 个字节的内容并不重要。 在动态值中,属性标记的类型确定如何解释值数据。

PT_STRING8

值数据 字节数
字节数 n
4
要解释为 ANSI 字符串的字节 (包括 NULL 终止符)
n

PT_CLSID

值数据 字节数
要解释为 GUID 的字节数
16

PT_BINARY

值数据 字节数
字节数 n
4
要解释为字节数组的字节数
n

PT_MV_BINARY

值数据 字节数
二进制数组数 X
4
包含 X 二进制数组的字节的运行。 每个数组的解释应与PT_BINARY字节运行完全相同。 变量

PT_MV_STRING8 (Outlook 2007、Outlook 2010 和 Outlook 2013)

值数据 字节数
ANSI 字符串数 X
4
包含 X ANSI 字符串的字节的运行。 每个字符串的解释应与PT_STRING8字节运行完全相同。 变量

PT_MV_UNICODE (Outlook 2007、Outlook 2010、Outlook 2013)

值数据 字节数
UNICODE 字符串 X 的数目
4
包含 X UNICODE 字符串的字节的运行。 每个字符串的解释应与PT_UNICODE字节运行完全相同。 变量

重要属性

如本主题前面所述,表示属性的二进制块具有对应于通讯簿收件人上的属性的属性标记。 对于此处未列出的属性,可以在 中查找属性说明 https://msdn.microsoft.com/library/cc433490(EXCHG.80).aspx

属性名 属性标记 说明 (请参阅 MSDN,了解详细信息)
PR_NICK_NAME_W (未在收件人上传输,特定于仅自动完成流)
0x6001001f
此属性必须在每个收件人行中处于第一位。 它在功能上充当收件人行的键标识符。
PR_ENTRYID
0x0FFF0102
收件人的通讯簿条目标识符。
PR_DISPLAY_NAME_W
0x3001001F
收件人的显示名称。
PR_EMAIL_ADDRESS_W
0x3003001F
收件人的电子邮件地址 (,例如 johndoe@contoso.com or /o=Contoso/OU=Foo/cn=Recipients/cn=johndoe)
PR_ADDRTYPE_W
0x3002001F
收件人的地址类型 (例如 SMTP 或 EX) 。
PR_SEARCH_KEY
0x300B0102
收件人的 MAPI 搜索键。
PR_SMTP_ADDRESS_W
0x39FE001f
收件人的 SMTP 地址。
PR_DROPDOWN_DISPLAY_NAME_W (不会在收件人上传输,特定于自动完成流)
0X6003001f
自动完成列表中显示的显示字符串。
PR_NICK_NAME_WEIGHT (不会在收件人上传输,特定于自动完成流,仅)
0x60040003
此自动完成项的权重。 权重用于确定匹配自动完成列表时自动完成项的顺序。 权重较高的条目将显示在权重较低的条目之前。 完整的自动完成列表按此属性排序。 权重会随着时间的推移而定期减少,并在用户向此收件人发送电子邮件时增加。 有关此属性的详细信息,请参阅本主题后面的说明。

PR_NICK_NAME_WEIGHT

自动完成流中的行集按 PR_NICK_NAME_WEIGHT 属性按降序排序,自动完成流应始终保留此排序特征。 因此,对行粗细的任何更改还应确保行的位置保持完整行集的排序顺序。 对行集添加的任何内容都应插入到正确的位置,以保持排序顺序。

此权重的最小值为0x1最大值为LONG_MAX。 权重的任何其他值都被视为无效。

当 Outlook 2007 向收件人发送邮件或解析收件人时,它将0x2000增加该收件人的权重。