开发 TNEF-Enabled 传输提供程序

适用于:Outlook 2013 | Outlook 2016

为了促进支持不同 MAPI 功能集的消息传送系统之间的互操作性,MAPI 提供了传输中性封装格式 (TNEF) 作为传输数据的标准方法。 此格式将基础消息传送系统不支持的 MAPI 属性封装到二进制流中,该流可在传输提供程序发送消息时随消息一起传输。 然后,接收消息的传输提供程序可以解码二进制流,以检索原始消息的所有属性,并将其提供给客户端应用程序。 TNEF 的操作模型是:

  • 消息客户端像平常一样向 TNEF 传输提交和接收消息。

  • 传输将传出消息的属性分为两个类别:基础消息系统支持的属性和不支持的属性。 基础消息传送系统支持的属性值将转换为所需的格式。

  • 传输使用 MAPI TNEF 方法将任何不受支持的属性编码为单个数据流。 然后,在发送消息之前,传输将使用基础消息系统的附件模型将该数据流转换为传出邮件上的特殊附件。

  • 接收此类消息的已启用 TNEF 的传输将执行两项操作。 首先,它将传入消息的属性(基础消息系统支持的属性)转换为 MAPI 属性。 其次,如果存在特殊附件,它将使用 MAPI TNEF 方法从附件中检索其他 MAPI 属性,然后再将消息传递到客户端应用程序。

MAPI 提供 ITnef 接口的实现,供 MAPI 传输提供程序在使用 TNEF 对象时使用。 OpenTnefStreamEx 函数用于创建 TNEF 对象并将其与消息相关联。 TNEF 流基于 OLE IStream 接口构建

注意

使用 OpenTnefStreamEx 创建 TNEF 对象。 为了与旧源代码兼容,旧的 OpenTnefStream 函数仍然存在,不应用于任何新内容。

ITnef 接口提供以下方法:

MAPI TNEF 实现模型支持:

  • 不影响其他消息属性的所有 MAPI 属性。 为了使 MAPI 消息通过消息传递系统继续传输,必须封装无法编码为消息系统属性的所有属性。 由于在发送消息时几乎永远不会知道与 MAPI 兼容的客户端是否会接收消息,因此封装方案允许传输提供程序仅对消息传送系统本身不支持的 MAPI 消息属性进行编码。 这意味着,使用 TNEF 的消息对不基于 MAPI 的邮件系统(例如基于 SMTP 的 UNIX 消息传递系统)不“不透明”。 这些系统以任何典型方式接收它们支持的属性,其他属性作为编码的 TNEF 数据流接收。 TNEF 传输提供程序负责区分这两组属性,并以正确的方式为消息系统发送受支持的集。 TNEF 对消息传送系统提供的支持级别不作任何假设。 但是,在本部分中包含的 TNEF 用法示例中,假定邮件系统支持除邮件外至少一个附件。 在某些情况下,只能通过 uuencoded 流支持附件,并作为邮件文本的一部分进行传输。 只有在极少数情况下,消息传送系统对消息属性的支持很少,因此需要对所有属性进行完整的 TNEF 编码。

  • 基于 MAPI 属性 (PidTagTnefCorrelationKeyPR_TNEF_CORRELATION_KEY) 确定传入消息上的 TNEF 流是否属于消息的机制。 应在 TNEF 流和相应的消息标头中找到此属性。 如果属性在这两个位置具有相同的值,或者在任一位置中缺失,则假定 TNEF 流属于消息。 否则,将忽略 TNEF 流。 启用 TNEF 的传输负责在出站邮件上为此属性选择一个值,并将其编码为适当的邮件头 (例如,消息 ID:SMTP 邮件) 和 TNEF 流中的标头。