读取和修改 Exchange 2013 传输管道中的邮件

了解 Exchange 2013 传输代理中可用于读取、写入和修改邮件的.NET Framework类。

适用于:Exchange Server 2013

  • 用于读取、写入或修改消息的类
  • 编码器命名空间
  • iCalendar 命名空间
  • MIME 命名空间
  • TextConverters 命名空间
  • Tnef 命名空间
  • vCard 命名空间

当消息通过传输管道时,传输代理可以在不同的数据格式之间读取、写入和转换消息内容。 例如,可以读取和写入 MIME 数据,识别采用 Uuencoded 或 Quoted 打印 (qp) 格式的传入邮件,然后将其转换为组织使用的标准,或者读取并保存与传入邮件关联的日历或联系人信息。

还可以识别构成安全威胁的内容,并移动或删除包含它们的内容或消息;例如,通过删除 HTML 邮件中的链接。

本文提供有关可用于读取、写入和修改消息的.NET Framework类的信息。

谨慎

内容转换 API 中的许多属性和参数允许的值足够大,导致性能问题,包括拒绝服务。 在传输代理中使用内容转换 API 时,应对读取或写入时支持的属性和参数值大小实施限制,以限制代理的资源消耗。

用于读取、写入或修改消息的类

下表列出了可用于读取、写入和修改电子邮件的.NET Framework类。

.NET Framework消息处理命名空间

.NET Framework 命名空间 课程
Microsoft.Exchange.Data.Mime.Encoders
包含用于内存中编码和解码的类、接受关联枚举中包含的其中一个编码器或解码器类的编码器流类,以及编码器和解码 器的 ByteEncoder 基类和 ByteEncoderException 异常类。
Microsoft.Exchange.Data.ContentTypes.iCalendar
包含类型,使你能够读取和写入包含日历信息的数据流。 包括日历读取器和编写器、异常对象、定期对象以及有助于返回有关日历项的属性信息的结构和枚举。
Microsoft.Exchange.Data.Mime
包含可用于创建、读取、写入、遍历、编码和解码 MIME 数据的类、结构、枚举和委托。 包括一个基于流的读取器和编写器,该读取器和编写器提供对 MIME 数据流的仅向前读取和写入访问权限,以及可用于 MIME 文档的基于 DOM 的方法和类。
Microsoft.Exchange.Data.TextConverters
包含类、结构、枚举和委托,允许读取和写入数据流,并在特定数据类型之间执行转换;例如,RTF) (HTML 到 RTF 格式。 文本转换器使你能够将文档流的格式从一个窗体更改为另一个窗体,以及有选择地删除可能构成安全风险的文档元素。
Microsoft.Exchange.Data.ContentTypes.Tnef
包含仅限向前的流读取器和编写器、异常类以及结构和枚举,它们有助于读取和写入传输中性封装格式 (TNEF) 数据。
Microsoft.Exchange.Data.ContentTypes.vCard
包含仅向前流读取器和写入器、异常类以及有助于读取和写入 vCard 格式的联系人数据的结构和枚举。

编码器命名空间

Encoders 命名空间包含用于内存中编码和解码的类。 这些继承自 ByteEncoder 基类。 Base64、BinHex、Quoted-printable (qp) 和 Unix 到 Unix (Uu) 的类进行编码和解码。 以下类用于内存中编码和解码:

编码器和解码器继承自 ByteEncoder 基类,并使用 ByteEncoderException 异常类来处理错误。

此外,命名空间包含 MacBinaryHeader 类,该类标识 MacBinary 编码的文件并读取其关联的文件头。

最后, EncoderStream 类对数据流而不是内存中对象执行转换。 此类接受其中一个编码器或解码器类,并根据关联的 EncoderStreamAccess 枚举进行读取或写入。

iCalendar 命名空间

除了支持用于创建、访问和修改 iCalendar 流的结构和类外,iCalendar 命名空间还提供 iCalendar 数据的仅向前读取器和编写器。

CalendarReaderCalendarWriter 类用于读取和写入 iCalendar 流数据。

CalendarReader 将可读 作为其构造函数的参数。 然后,可以使用 ReadFirstChildComponentReadNextSiblingComponentReadNextComponent 方法按顺序访问数据流中的 iCalendar 组件。 根据为 ComplianceMode 属性设置的值,iCalendar 流中的错误将导致引发异常,或者将 ComplianceStatus 属性设置为 不相容的值。 可以检查此属性以发现传入 iCalendar 数据的任何问题。

CalendarWriter 类采用可写 Stream 作为其构造函数的参数。

MIME 命名空间

MIME 命名空间提供可用于创建、访问和修改 MIME 文档的类。 可以使用基于流或基于 DOM 的方法处理 MIME 文档。

MimeDocument 类和 MIME DOM

MimeDocument 类允许 DOM 访问 MIME 文档。 如果具有用于加载整个 DOM 的可用内存,并且必须对消息的标头和内容具有随机访问权限,请使用此类型的对象。

使用 GetLoadStreamLoad 方法将数据加载到 MimeDocument 对象中。 然后,可以遍走 DOM 层次结构并创建、修改或删除 MIME 数据。 修改 MIME 数据后,可以使用 WriteTo 方法之一将其写入流。

下图显示了 MimeDocument 对象中的数据结构。

图 1. MimeDocument 对象的结构

MIME DOM 体系结构

MimeReader 和 MimeWriter 类以及基于流的 MIME 分析

MimeReaderMimeWriter 类支持对 MIME 流的仅向前访问。 无需更改需要已读取或写入数据的 MIME 数据时,请使用这些类。 例如,如果要打印适合预定义格式的邮件, MimeWriter 类可能很理想。

MimeDocument 类封装 DOM。 MimeReaderMimeWriter 类表示状态计算机。 其状态会根据收到的输入和调用的方法而更改。 图 2 到图 5 是简化的状态转换关系图,其中显示了 MimeReader 对象的哪些方法可用于从每个状态调用,以及将产生的状态。

若要使用这些关系图,请按照从一个状态到下一个状态的箭头操作,并指出方法调用或返回导致状态更改的值。 例如,在第一个关系图中,假设你位于属于已创建的 MimeReader 的流的开头。 若要获取部件标头状态,请按该顺序调用 ReadNextPartReadFirstChildPart 之一。 如果有标头 (即 MIME 格式正确的) ,则你将进入“部件标题”状态。 否则,将引发异常。

图 2. MimeReader 对象的简化状态转换关系图

MimeReader 状态图表

注意

图 3、图 4 和图 5 扩展了前面每个关系图中显示的状态。

图 3. 图 2 中部件标头状态的扩展

“部件标题”状态扩展

图 4. 在标头中遇到参数时,从图 3 扩展标头状态

在标头中遇到参数时扩展“部件标头”状态

注意

图 5 表示的状态是递归的,如果遇到地址组,可以使用 GroupRecipientReader 属性读取组中的地址。

图 5. 遇到地址或地址组时,从图 3 扩展标头状态

用于地址或组的“标题”状态扩展

图 6 和图 7 显示了 MimeWriter 对象的简化状态转换图。

注意

图 7 扩展了图 6 所示的部件标题状态。

图 6. MimeWriter 对象的简化状态转换图

用于 MimeWriter 的状态切换图表

图 7. 图 6 中部件标头状态的扩展

用于 MimeWriter 的状态切换图表扩展

TextConverters 命名空间

TextConverters 命名空间包含支持转换电子邮件内容的类型。 这些类型可以执行代码页转换、删除不安全的 HTML,以及对电子邮件正文执行其他转换。 Microsoft.Exchange.Data.TextConverters 命名空间包括派生自 TextConverter 抽象类的以下类:

借助这些文本转换器,可以更改文档流的格式,或者从 HTML 文档中删除不安全的元素。 这些类可以通过对 TextConverter 基类中的一个 Convert 方法进行单个调用来执行转换,也可以将它们传递给转换器的构造函数,该构造函数使用它来执行转换后的读取或写入。

如果有足够的空间来存储原始文档及其转换后的输出,或者想要存储转换的结果,则从基类继承的功能对于执行转换非常有用。 Convert 方法采用输入和输出流、文本读取器或文本编写器,并将输入的内容转换为关联的输出。

命名空间中还包括以下文本读取器、编写器和流类:

当你没有空间来存储原始输出或其转换后的输出时,当接收来自流或将输出发送到流时,或者你希望输出仅用于索引或搜索目的,因此不希望存储转换的结果时,这些用于执行转换。

Tnef 命名空间

Tnef 命名空间包含类和类型,这些类和类型支持基于流的仅向前读取和写入 TNEF 数据。 TNEF 是一种数据格式,用于封装无法解释 MAPI 的客户端的 MAPI 属性。

TnefReaderTnefWriter 类提供 Microsoft.Exchange.Data.ContentTypes.Tnef 命名空间中的核心功能。

TnefReader 类采用可读流作为其构造函数的参数。 然后,使用 ReadNextAttribute 方法按顺序读取 TNEF 流中的属性。 读取属性后,除了获取 TnefPropertyReader 读取当前属性外,还可以使用 TnefReader 对象上的任何只读属性来访问有关该属性的信息。 还可以使用 ReadAttributeRawValue 方法直接访问当前属性。

TnefWriter 类采用可写作为其构造函数的参数。 TnefWriter 类提供多种将数据写入此流的方法。

vCard 命名空间

vCard 命名空间包含类、结构和枚举,这些类、结构和枚举用于读取和写入 vCard 数据格式的电子邮件中包含的联系信息。 命名空间包含联系人读取器和编写器、异常类、属性读取器、参数读取器以及支持枚举,允许读取与电子邮件关联的 vCard 数据。

另请参阅