对于 WCF Exchange Server 邮件传输,WCF 终结点由 WCF 绑定和终结点地址一起表示。WCF 绑定指定通信使用的参数。它表示一个绑定元素集合,其中包括传输绑定元素、编码绑定元素和安全绑定元素。对于使用邮件传输的应用程序,这些元素的定义如下:
除了实例化 CustomBinding 对象中的绑定元素集之外,应用程序还可以使用派生自 MailBindingBase 对象的类创建预定义的绑定元素集合。此类不仅包括电子邮件传输绑定元素,还包括文本编码绑定元素以及可选的邮件安全性。
邮件可以包含在电子邮件正文中,也可以用附件形式发送。邮件的“主题”行包含信道名称。邮件用自定义的 WCF 电子邮件信道戳标识,后者由 Exchange Server 使用的邮件类提供。
发送邮件
应用程序发送邮件时,将对当前的输出信道调用 Send 方法,该信道必须处于打开状态。输出信道会将邮件序列化为一个字符串,并在“草稿”文件夹中创建邮件。它会在各个电子邮件字段中设置相应的值。邮件创建完毕后,将被移至“发件箱”。这是通过设备中的 CEMAPI 或桌面上的 Exchange Web 服务来完成的。在设备上,“发件箱”中的邮件将按照 ActiveSync 的定义与其他传出邮件同步。
接收邮件
当基于 WCF Exchange Server 邮件传输的应用程序接收邮件时,将发生以下过程:
应用程序打开输入信道。
输入信道调用 Receive 方法,以开始侦听邮件。
当 Exchange 电子邮件服务器收到带有 WCF 电子邮件信道戳的邮件时,它会自动将该邮件传送至“服务电子邮件”文件夹,此文件夹与“收件箱”处于同一级别。
说明: |
|---|
如果 Exchange 电子邮件服务器未配置为将 WCF Exchange Server 服务邮件传送至“服务电子邮件”文件夹,它将改用“收件箱”。 |
正在侦听新邮件事件的输入信道会检查到达“服务电子邮件”或“收件箱”文件夹中的每一封邮件。
输入信道在侦听邮件时会阻止代码。
如果输入信道与邮件中的特定信道名称匹配,它将检索该邮件并取消对代码的阻止。
对于基于同一传输构建的多个输入信道,可以调用 Receive 方法。只有对同一线程上的同一输入信道第二次调用 Receive 时才会发生阻止。
说明: |
|---|
每个信道侦听器只能与一个输入信道关联。只有第一个输入信道关闭后,对信道侦听器的 AcceptChannel 方法的第二次调用才会返回。 |
为了获得更大的灵活性,可以将电子邮件传输配置为对不同大小的邮件采用不同的处理方法。例如,根据邮件的大小,可以将邮件作为附件发送,也可以将其包括在电子邮件正文中发送。初始同步期间,可能无法完全下载较大的邮件。在设备上,“服务电子邮件”或“收件箱”文件夹中的邮件将按照 Microsoft ActiveSync 所定义的那样与其他传入邮件同步。
说明: |
|---|
对于设备,ActiveSync 电子邮件同步设置将控制最初下载到该设备上的每封邮件的最大大小。如果邮件超过此大小,则最初只会下载该邮件正文的一部分。如果只下载了部分邮件而信道侦听器正在等待该邮件,则传输将标记该邮件以指示必须将其完整下载。在下次同步会话中,将下载完整的邮件。 |
收到邮件时,通过使用 Message 类中的 FromEmailAddress 自定义属性,可以获取发送方的电子邮件地址。下面的示例演示如何使用此属性。
System.ServiceModel.Channels.Message m;
String senderAddress;
m = input.Receive();
senderAddress = m.Properties.ContainsKey("FromEmailAddress")删除邮件
当应用程序收到请求的邮件后,传输会立即删除该邮件。在处理完传入邮件后删除这些邮件的过程因平台而异。
在安装有 Windows Mobile 的设备上,删除传入邮件的过程包括下列步骤:
输入信道调用 Receive 方法后检索某邮件。
邮件传输发出调用,以便从安装有 Windows Mobile 的设备上的邮件存储区中删除该邮件。
在下次电子邮件同步期间,将从服务器上删除该邮件。
在桌面上,删除传入邮件的过程包括下列步骤:
输入信道调用 Receive 方法后检索某邮件。
邮件传输将该邮件置于已删除邮件的缓存中,此缓存是邮件传输拥有的内部缓存。
在下次查询间隔期间,邮件传输将检查已删除邮件的缓存。
查询间隔由 ServerQueryInterval 属性决定。
如果已删除邮件的缓存中含有任何邮件,邮件传输将向服务器发出一个含有删除命令的查询,以删除该缓存中的邮件。
在查询期间,邮件传输将检查服务器事件,并下载所有关联的邮件。
邮件传输将所有已下载的邮件发送至它的处理缓存,以供应用程序处理。
在桌面上,如果出现下列情况,邮件传输还会向服务器发出一个命令,以删除已删除邮件的缓存中的邮件:
这些操作是同步的;Close 和 Dispose 会阻止代码,直至从服务器中删除邮件。根据必须要删除的邮件数目,删除邮件所需的时间会有所不同。如果在执行此过程期间发生失败,传输还将进行多次尝试,以删除这些邮件。
在安装有 Windows Mobile 的设备上,此功能由邮件存储区处理。
当邮件无效或格式不正确时,也会删除它们。SOAP 信封已损坏的邮件将被视为无效邮件,并将永久删除。在邮件的主题行中,如果 WCF 电子邮件信道戳后跟有错误的信息,例如信道名称中含有不受支持的字符,则此邮件将被视为格式不正确的邮件。这类邮件将被移至“已删除”文件夹中。