Email模块中的POP3协议

Email模块中的POP3协议

一、概述

Email协议包括两部分,一部分是发送Email的协议,一般是smtp协议;另一部分是接收Email的协议,常见的有POP3协议和imap协议。现讨论接收Email的POP3协议。

POP3 (Post Office Protocol 3) 即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准, POP3 允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循 POP3协议的接收邮件服务器,用来接收电子邮件的。

POP3协议是TCP/IP协议族中的一员,,由RFC 1939定义。此协议的详细文档可以在此网站下载:http://datatracker.ietf.org,搜索rfc1939即可下载,其它rfc文档也可以下载。

既然它是一个邮件接收协议,那么它规定了提供邮件服务的服务器提供何种服务,同时也告诉我们如何从服务器通过何种命令接收邮件。

 

二、POP协议的基本内容

POP3客户向POP3服务器发送命令并等待响应,POP3命令采用命令行形式,用ASCII码表示。服务器响应是由一个单独的命令行组成,或多个命令行组成,响应第一行以ASCII文本+OK或-ERR指出相应的操作状态是成功还是失败。

在POP3协议中有三种状态,认可状态,处理状态,和更新状态。当客户机与服务器建立联系时,一旦客户机提供了自己身份并成功确认,即由认可状态转入处理状态,在完成相应的操作后客户机发出quit命令,则进入更新状态,更新之后最后重返认可状态。如下图

 等待连接    身份确认     quit命令

   —— |认可|————— |处理|——————|更新|

      |_____________________________|

            重返认可状态

POP3命令码如下:

 

三、实例

我有一个网易的163邮箱,那么我如何通过我的帐号和密码来查看我的邮件。首先,网易邮箱也需要遵从POP3协议,所以它提供了一个邮箱服务器,地址是pop.163.com,对于POP3协议的默认端口为110,所以我们可以通过socket通信来实现查收邮件。主要步骤包括:

1.通过socket连接到域名为pop.163.com,端口为110的网易邮箱服务器;

2.输入本人的邮箱帐号和密码,通过服务器的身份验证;

3.查收邮件。

下面我们通过telnet工具连接到服务器来模拟这个过程:

连接到服务器,通过身份验证后查看邮箱中邮件信息

执行telnet pop.163.com 110

此命令连接到163邮箱提供的pop服务器,端口号为110

执行user yutao658,返回+OK core mail

表明我们要登录的邮箱名称为yutao658@163.com,+OK表明此邮箱存在

执行pass abc123,返回+OK 3 message(s)[29685 byte(s)]

表明我们的密码是abc123,服务器返回+OK,则表明我们的身份认证已经通过

执行stat,返回+OK 3 29685

要求服务器返回邮箱中邮件的统计资料,表明一共有三封邮件,总大小为29685个字节。

执行list,返回多行内容:

+OK3 29685

113075

214588

32022

.

这里没有指明哪一封邮件,则显示了全部三封邮件的大小,“.”表示服务器返回结果结束。

执行list 3,返回+OK 3 2022

此时则只显示第三封邮件的大小为2022字节。

从服务器中查看邮件内容

执行retr 3命令,则返回编号为3的邮件的全部内容。

最后执行quit,则结束连接。

 

四、Android 相关源码

在Email这个应用中,涉及到POP3协议的主要操作包括在添加账户过程中对用户账户的有效性的验证,和后续从服务器取邮件这两个部分。

相关代码在Pop3Store.java这个文件中,其中内部类Pop3Folder完成了大部分工作,涉及的主要方法为checkSettings()方法和fetch()方法,本别实现账户设置时帐号和密码的有效性验证以及后续的查收邮件。

MailTransport这个类负责socket通信,其中最重要的是open方法,负责建立socket连接;writeLine方法,向服务器发送单行命令;readLine方法,每次读取一行服务器下发的数据。

下面就是在账户设置是验证账户有效性的过程,也就是checkSettings方法与服务器的交互,输出log如下所示:

MailTransport.open()  POP3 open pop3.126.com:110

D/yutao   ( 2288): response = +OK Welcome to coremailMail Pop3 Server (126coms[96cf230d1dfd5e9799113d194aeefd37s])

D/yutao   ( 2288): command  = CAPA

D/yutao   ( 2288): response = +OK Capability listfollows

D/yutao   ( 2288): command  = USER yt_658@126.com

D/yutao   ( 2288): response = +OK core mail

D/yutao   ( 2288): command  = PASS XXXXXX

D/yutao   ( 2288): response = +OK 116 message(s)[73902832 byte(s)]

D/yutao   ( 2288): command  = STAT

D/yutao   ( 2288): response = +OK 116 73902832

D/yutao   ( 2288): command  = QUIT

D/yutao   ( 2288): response = +OK core mail

MailTransport.close()

首先,通过MailTransport类的open方法,建立socket连接host为pop3.126.com,port为110然后,读取服务器返回的命令:

+OKWelcome to coremail Mail Pop3 Server(126coms[96cf230d1dfd5e9799113d194aeefd37s])

capa命令是用来查看此pop3服务器支持哪些可选的命令,这里了解即可。

依次执行user和pass命令,返回+OK 116 message(s)[73902832 byte(s)],表明身份验证ok,否则会返回-ERR,表明验证失败。

这里还顺便利用stat获取了邮件状态信息,最后退出,这就是身份验证的过程。非常简单,如果在这个过程中,服务器返回了-ERR,则可能是服务器不存在、端口号不正确、账户或密码存在问题等原因,这样都不能通过验证。

对于接收邮件的fetch方法,则更简单,同样需要建立连接,通过身份验证,然后通过retr命令就可以得到邮件的全部内容,但是正如我们前面看到的,返回的邮件内容非常复杂,它遵从一定的格式,且部分内容还涉及到一些加密算法,所以通过retr获取到邮件内容后对邮件进行解析是接下来最重要的工作,这部门内容非常复杂,代码量也很大,其中也有很多TCP/IP关于Email规范的协议。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值