协议介绍 :
电子邮件是一个非常有用和"古老"的应用 , 目前情况下 , 它遵循了三种协议 :
- SMTP协议
- 主要应用于发送邮件 , 全称为 :
Simple Mail Transfer Protocol
- 主要应用于发送邮件 , 全称为 :
- POP3协议
- 主要应用于接收邮件 , 全称为 :
Post Office Protocol - Version 3
- 主要应用于接收邮件 , 全称为 :
- IMAP协议
- 一种比SMTP和POP协议都要新的协议 , 支持更多的功能和操作(对邮件的搜索等) , 主要应用于邮件的接收
实战一 : (利用Telnet/nc手动发送邮件)
- Windows环境下 : (可以使用Telnet命令)
- 首先我们需要打开Windows的Telnet功能 , 需要在
控制面板-程序-启用或关闭Windows功能-Telnet客户端
- 然后我们就可以使用Telnet命令 , 我们需要使用Telnet连接到我们的邮件服务器上 , 然后通过SMTP支持的命令进行邮件的发送
- 这里我们使用163邮箱的smtp服务器 , 服务器的地址 :
smtp.163.com
, 端口25
- 我们在命令行中输入 :
telnet smtp.163.com 25
- 成功连接到163的SMTP服务器
- 这里需要了解的是SMTP协议是
Command/Response
模式的 , 这个和HTTP协议有一点不同 , HTTP 协议基于Request/Response
- 这个时候我们需要输入命令(Command)
- 向服务器发送握手数据
HELO 163.com
- 向服务器请求登陆
AUTH LOGIN
- 输入Base64编码以后的用户名
-
Base64(YourUsername)
注意这里的用户名不包含@163.com
- 输入Base64编码以后的"密码"
-
Base64(YourPassword)
注意这里的密码并不是163邮箱的登陆密码 , 而是需要你登陆网页版的163邮箱打开SMTP服务的时候配置的密码 - 如果这个时候服务器返回成功 , 则说明我们已经成功登陆
- 然后我们就可以输入发送邮件的命令了
- 首先需要设置发送方
-
MAIL FROM: <Your Email Address>
例如 : 你的邮箱是 sunshine@163.com , 那么这里你要输入的就是MAIL FROM: <sunshine@163.com>
- 设置接收方
RCPT TO: <Receiver's Email Address>
- 然后输入邮件 , 这里说的
邮件
包含两个部分 , 邮件头和邮件主 , 邮件头中可以定义 :Subject , From , To
这些属性 , 分别对应的就是 :主题 发件人 收件人
, 邮件头结束以后需要添加一个空行 , 用于分割邮件头和邮件正文(主体) , 注意这里邮件的主体在结束的时候需要在一个空行中键入一个英文的句号.
, 用来表示邮件已经结束 , 最后键入回车换行即可提交给邮件服务器 , 加入邮件服务器的待发送队列中 , 一般很快就会收到邮件Subject:Hello world! From:Your Email Address To:Receiver's Email Address Across the Great Wall we can reach every corner in the world. .
- 然后屏幕就会显示发送状态 , 如果发送成功会有ok的字样 , 如果发送失败 , 也会有错误码 , 我们可以根据这个错误码去查询失败的原因然后修正
-
整个流程截图如下 :
-
注意 : 下图中的邮件头和邮件主体(正文)之间少了一个空行 , 这样的话会导致邮件的正文不能正常发送 , 发送后显示正文为空 , 笔者之后才发现 , 之前一直纳闷这个问题 , 希望这张图不要给大家误导(已修复)
-
这个时候我们就可以查看我们的邮箱 , 这里我使用了自己的163邮箱 , 将发件人和收件人都填写成了同一个 , 我们登陆看看有没有成功收到邮件 :
- Linux环境下 : (可以使用Telnet/nc命令)
- Linux环境下 , 使用nc命令也是和Telnet非常类似 :
nc smtp.163.com 25
, 然后成功登陆163的SMTP服务器之后的操作就和Windows完全没有区别了 , Telnet也是和Windows没有任何区别 , 这里不再赘述
实战二 : (利用Telnet/nc手动接收并操作邮件 , 例如获取所有邮件/删除某个邮件等)
这次我们还是利用刚才的那个邮箱 , 我们首先登陆网页客户端来看一下邮箱里面的邮件列表
我们可以看到收件箱里面总共有三封邮件
我们现在开始使用命令来连接邮件服务器 , 并获取收件箱列表 , 同样 , 由于Windows和Linux系统在这里的操作并没有什么区别 , 这里就直接使用Windows下的Telnet客户端进行演示 :
- 首先使用Telnet连接到邮件服务器(POP3)
-
Telnet pop3.163.com 110
POP3使用的默认端口是110 - 连接成功后 , 进入交互界面 , 由于这里我们需要获取用户的收件箱列表 , 因此肯定需要一个认证的过程
-
User:YourUsername
用户名是明文 , 不需要Base64编码, 注意不要添加多余的空格 -
Pass:yourPassword
密码是明文 , 不需要Base64编码, 注意不要添加多余的空格 - 如果认证成功的话 , 会有相应的提示 , 并且会显示收件箱的邮件个数 , 还有所有邮件的内容长度总和
- 现在我们可以对邮件的列表进行获取
List
- 这样就会显示收件箱中的所有邮件的编号和内容长度
- 可以使用
Retr 邮件编号
来获取邮件的内容 , 包括邮件头 , 邮件正文 - 可以使用
Dele 邮件编号
来删除某个制定的邮件 , 注意 : 这里的删除指的是 : 从服务器删除 - 可以使用
Quit
退出并断开与服务器的连接 -
截图 :
关于POP3和SMTP协议的命令还有很多 , 这里只介绍了最简单常用的几个 , 大家有兴趣可以参考Wiki上的介绍 , 很详细 , 也可以去参考RFC的官方文档
SMTP状态码 :
Code | 英文描述 | 中文描述 |
---|---|---|
211 | System status, or system help reply | 系统状态或显示系统帮助。 |
214 | Help message | 显示系统帮助,通常用于显示非标准命令的帮助。 |
220 | Service ready | 服务就绪。 |
221 | Service closing transmission channel | 服务关闭了传输通道。 |
250 | Requested mail action okay, completed | 所要求的邮件动作完成,可以继续邮件对话。通常在EHLO/HELO命令后会通过“250-”来描述服务器所支持的特性。 |
251 | User not local; will forward to | 收件人非本地用户,将转发到 。 |
354 | Start mail input; end with . | 开始接收邮件内容输入,以.(即单行一个点)结束输入。 |
421 | Service not available, closing transmission channel | 无法提供正常服务,关闭传输管道。邮件保留在本地,可能会尝试重新投递。通常这种情况发生在服务器遇到问题,必须关闭传输。 |
450 | Requested mail action not taken: mailbox unavailable | 所要求的邮件动作无法执行:邮箱不可用。邮件保留在本地,可能会尝试重新投递。通常这种情况发生在邮箱忙或被拒绝等。 |
451 | Requested action aborted: local error in processing | 要求动作中断:本地端发生错误。邮件保留在本地,可能会尝试重新投递。通常这种情况发生在系统投递时遇到意外的错误。 |
452 | Requested action not taken: insufficient system storage | 要求动作无法执行:系统空间不足。邮件保留在本地,可能会尝试重新投递。通常这种情况发生在邮箱限额满。 |
500 | Syntax error, command unrecognized | 命令格式错误,不可识别。当命令行太长时也会发生这样的错误。 |
501 | Syntax error in parameters or arguments | 命令参数错误。 |
502 | Command not implemented | 命令尚未实现。 |
503 | Bad sequence of commands | 错误的命令顺序。 |
504 | Command parameter not implemented | 命令的参数尚未实现。 |
550 | Requested action not taken: mailbox unavailable | 所要求动作无法执行:信箱不存在。不再尝试投递。 |
551 | User not local; please try | 收件人不属于本地用户,转发到。不再尝试投递。 |
552 | Requested mail action aborted: exceeded storage allocation | 所要求的动作中断:超出所分配的储存空间。不再尝试投递。 |
553 | Requested action not taken: mailbox name not allowed | 所要求的动作未执行:不接受该信箱。通常发生在邮件地址错误、被作为垃圾邮件拒收。不再尝试投递。 |
554 | Transaction failed | 传输失败。 |
参考资料 :