IMAP,POP3及Exchange协议讲解

时间:2022-12-13 00:28:41

昨天论坛上有个用户说他用POP3客户端收到一封要求回执的邮件,但是他还没有打开它,已读回执就已经发出去了。于是他来求助这是怎么回事。

IMAP,POP3及Exchange协议讲解

        这是一个已知问题,描述是POP3客户端用户在还没有打开邮件时就会将已读回执发出,阅读后又会发送一份已读回执,简称重复回执Duplicate Receipt)。

        微软官方声称这个问题只存在于Exchange2007 SP3 RU3之前的版本,但就我发现的情况,Exchange2010和2013都有同样的问题,我相信2016也是如此。不是说Exchange产品组不作为,迟迟不修复这个‘Bug’,而是这是POP3协议自身的问题

        试想,服务器上的一封邮件是要求已读回执的,然而这封邮件被取走了而服务器不知道客户端上这封邮件“拆了还是没拆”,他应该做出怎样的判断?很简单,邮件一定是因为要被读取而被取走的。于是收件方就会收到如下的已读回执:

Your message 

   To: Johnnie

   Subject: test - POP3

   Sent: Wednesday, August 30, 2017 3:46:51 PM  

 was read on Wednesday, August 30, 2017 3:47:03 PM 

        然后当你确实在POP3终端上查看了邮件,邮件的Unread标示位(Flag)在由1变0时会触发已读回执发送给发件人。相当于在邮件的某个属性上嵌套了一个宏,于是发件人就又收到了一封回执:

Your message

    To:  johnnie@xxx.com

    Subject:  test - POP3

    Sent:  8/30/2017 3:46 PM

was read on 8/30/2017 3:47 PM. 

        Exchange 2010之后EMS命令Set-PopSettings命令多了一个等待回执的参数(-SuppressReadReceipt),意思是服务器先不默认取走状态是已读状态,而是等收件人回执发到了服务端再看。然而等不来的回执,服务器默默发了以下第二封回执:

Your message 

   To: Johnnie 

   Subject: test - POP3

   Sent: 8/30/2017 3:47 PM. (UTC+08:00) 

was deleted without being read on 8/30/2017 3:47 PM. (UTC+08:00) 

        嗯。。。不算太坏吧,至少我们找到了特征字段,下面只要定义传输规则丢弃含这个字段的邮件就可以防止POP的重复回执了。

IMAP,POP3及Exchange协议讲解


        饶了一大圈,是时候来说说三大邮件协议的工作原理:

IMAP,POP3及Exchange协议讲解

        POP3作为三者中最老的协议,它会将邮件数据下载到第一个连接客户本地,如果还有用户想要连接下载的话,服务端已经没有了。它的好处是应用广泛;坏处是无法同步消息;一旦下载服务端即消失(你可以设置在服务端保存副本,但这并不改变协议的本质);无法同步联系人、日历和子邮件目录

IMAP,POP3及Exchange协议讲解

        与POP3的单向通讯不同,IMAP会来回地与邮件服务器通讯。这就意味着当你将一封新邮件下载到台式机的Outlook里,它将同样被下载到你的iPhone;如果你在iPad上阅读了一封邮件,这封邮件在你笔记本上的状态也会变为“已读”;包括移到其他目录的邮件(即便不在收件夹下)也将被同步。这个协议的问题在于容错性比较差。如果你的邮件账户同时有多个用户需要访问,IMAP可能并不是一个理想的协议。即如果用户A下载了邮件,同一账户的用户B将可能永远看不到了。它的好处是全邮件同步;可同步Flag和待办项目;易学易用。坏处是如果多用户使用同一账号,邮件同步可能在不同用户间造成困惑

IMAP,POP3及Exchange协议讲解

        Exchange协议可供用户同步邮件、联系人、日历及其他所有Exchange对象。由于这个协议需要部署Exchange服务器,因此通常为公司或者机构账号所用。它的好处是:全邮件同步;邮件保存在服务器上;支持绝大部分移动设备、联系人、日历和数据同步;在服务器域中邮件可撤回并修改。坏处是必须部署昂贵的Exchange服务器;邮件管理员可以控制你的终端设备权限并能看到邮件收发状态;同样会有同步问题