pop3&smtp
pop3&smtp
pop3
Post Office Protocol - Version 3
pop3协议是离线邮件协议,是客户端取邮件用的。
默认监听在TCP:110端口.
POP3会话有3个状态AUTHORIZATION、TRANSACTION和UPDATE不同状态能用的命令不同。
等待连接 身份确认 quit命令
—— |AUTHORIZATION|————— |TRANSACTION|——————|UPDATE|
|________________________________________________________|
重返认可状态
POP3命令码如下:
命令(ascII字符) | 参数 | 状态 | 描述 |
---|---|---|---|
USER | username | AUTHORIZATION | 用户名 |
PASS | password | AUTHORIZATION | 密码,若成功,将导致状态转换 |
APOP | username Digest(加密后密码) | AUTHORIZATION | Digest是MD5消息摘要 |
STAT | none | TRANSACTION | 请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数 |
UIDL(unique-id listing) | [message] | TRANSACTION | 返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的 |
LIST | [message] | TRANSACTION | 返回邮件数量和每个邮件的大小 |
RETR(retrieve) | [message] | TRANSACTION | 返回由参数标识的邮件的全部文本 |
DELE | [message] | TRANSACTION | 服务器将由参数标识的邮件标记为删除,会话进入UPDATE后删除 |
RSET | [message] | TRANSACTION | 服务器将重置所有标记为删除的邮件,用于撤消DELE命令 |
TOP | [message] | TRANSACTION | 服务器将返回由参数标识的邮件前n行内容,n必须是正整数 |
NOOP | [message] | TRANSACTION | 服务器返回一个肯定的响应 |
QUIT | none | UPDATE | pop3服务器删除标记为deleted的邮件,无论错误与否,释放独占锁、关闭TCP连接 |
wireshark抓包:第一张为开始,第二章为结束
SMTP
SMTP工作在两种情况下
- 发件人客户端传输到服务器
- 邮件服务器向另一个邮件服务器传输邮件
smtp是个请求/响应协议,命令和响应都是基于ascii文本,并以cr和lf符结束。响应包括一个表示返回状态的三位数字代码。
网图,来自https://blog.csdn.net/bripengandre/article/details/2191048
模型
-------------------------------------------------------------
+----------+ +----------+
+------+ | | | |
| User |<-->| | SMTP | |
+------+ | Sender- |Commands/Replies| Receiver-|
+------+ | SMTP |<-------------->| SMTP | +------+
| File |<-->| | and Mail | |<-->| File |
|System| | | | | |System|
+------+ +----------+ +----------+ +------+
Sender-SMTP Receiver-SMTP
-------------------------------------------------------------
命令格式
COMMAND [Parameter] 。其中COMMAND是ASCII形式的命令名,Parameter是相应的命令参数,是回车换行符(0DH, 0AH)。
XXX Readable Illustration。XXX是三位十进制数;Readable Illustration是可读的解释说明,用来表明命令是否成功等。XXX具有如下的规律:以2开头的表示成功,以4和5开头的表示失败,以3开头的表示未完成(进行中)。
命令
命令 | 描述 |
---|---|
HELO | 向服务器标识用户身份 |
MAIL FROM: | 为发送者地址 |
RCPT TO: | 用来标志邮件接收者的地址,常用在MAIL FROM后,可以有多个RCPT TO |
DATA | 将之后的数据作为数据发送,以.标志数据的结尾 |
REST | 重置会话,当前传输被取消 |
NOOP | 要求服务器返回OK应答,一般用作测试 |
QUIT | 结束会话 |
VRFY | 验证指定的邮箱是否存在,由于安全方面的原因,服务器大多禁止此命令 |
EXPN | 验证给定的邮箱列表是否存在,由于安全方面的原因,服务器大多禁止此命令 |
HELP | 查询服务器支持什么命令 |
AUTH LOGIN | 认证请求 |
EHLO | 除了HELO所具有的功能外,EHLO主要用来查询服务器支持的扩充功能 |
编码
250 8BITMIME /* 最后一个响应数字应答码之后跟的是一个空格,而不是'-' */
用户名、密码需采用base64编码(Base64就是一种基于64个可打印字符来表示二进制数据的表示方法。)
以“X”开头的关键字都是指服务器自定义的扩充(还没纳入RFC标准)
还有一些重要字段
Received: from DM6NAM11HT080.eop-nam11.prod.protection.outlook.com
(2603:1096:201:20::24) by HK0PR06MB3714.apcprd06.prod.outlook.com with HTTPS
via HK2PR02CA0212.APCPRD02.PROD.OUTLOOK.COM; Sat, 12 Oct 2019 02:04:31 +0000
Received: from DM6NAM11FT041.eop-nam11.prod.protection.outlook.com
(10.13.172.57) by DM6NAM11HT080.eop-nam11.prod.protection.outlook.com
(10.13.172.248) with Microsoft SMTP Server (version=TLS1_2,
cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.2347.16; Sat, 12 Oct
2019 02:04:30 +0000
Authentication-Results: spf=pass (sender IP is 120.26.244.201)
smtp.mailfrom=smail.kzedu.cc; hotmail.com; dkim=none (message not signed)
header.d=none;hotmail.com; dmarc=bestguesspass action=none
header.from=smail.kzedu.cc;
Received-SPF: Pass (protection.outlook.com: domain of smail.kzedu.cc
designates 120.26.244.201 as permitted sender)
receiver=protection.outlook.com; client-ip=120.26.244.201;
helo=smtp552.submail.cn;
Received: from smtp552.submail.cn (120.26.244.201) by
DM6NAM11FT041.mail.protection.outlook.com (10.13.172.98) with Microsoft SMTP
Server id 15.20.2347.16 via Frontend Transport; Sat, 12 Oct 2019 02:04:29
+0000
X-IncomingTopHeaderMarker:
OriginalChecksum:24B3073D37E1488647AB6D33914E56311671421DA99AC9F3ACCE5038C61D9AED;UpperCasedChecksum:4E628F444082EA3506FF7B7B728D6469D42940820A842E95A6AF817CE7359561;SizeAsReceived:633;Count:10
Date: Sat, 12 Oct 2019 2:4:28 +0000
Received是smtp服务器记录的从哪里收到的邮件。从上往下就是SMTP中继的各个节点。最下面的是发件服务器IP。
Received-SPF是防止假邮件的mail from可以伪造from更不用说,但是SPF记录该域名的邮件服务器的发件IP地址,可以验证真伪(要发假的垃圾邮件要模仿的是SMTP服务器行为,除非黑客控制了一个域名的邮件服务器)。
MIME消息由消息头和消息体两大部分组成,邮件头与邮件体之间以空行进行分隔
邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“: ”和信息内容构成,可以是一行,较长的也可以占用多行。域的首行必须“顶头”写,即左边不能有空白字符(空格和制表符);续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的,解码时要过滤掉。
邮件体包含邮件的内容,它的类型由邮件头的“Content-Type”域指出。常见的简单类型有text/plain(纯文本)和text/html(超文本),multipart/mixed, multipart/related和multipart/alternative。
multipart类型,是MIME邮件的精髓。邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。常见的multipart类型有三种:multipart/mixed, multipart/related和multipart/alternative。
+------------------------- multipart/mixed ----------------------------+
| |
| +----------------- multipart/related ------------------+ |
| | | |
| | +----- multipart/alternative ------+ +----------+ | +------+ |
| | | | | 内嵌资源 | | | 附件 | |
| | | +------------+ +------------+ | +----------+ | +------+ |
| | | | 纯文本正文 | | 超文本正文 | | | |
| | | +------------+ +------------+ | +----------+ | +------+ |
| | | | | 内嵌资源 | | | 附件 | |
| | +----------------------------------+ +----------+ | +------+ |
| | | |
| +------------------------------------------------------+ |
| |
+----------------------------------------------------------------------+
可以看出,如果在邮件中要添加附件,必须定义multipart/mixed段;如果存在内嵌资源,至少要定义multipart/related段;如果纯文本与超文本共存,至少要定义multipart/alternative段。什么是“至少”?举个例子说,如果只有纯文本与超文本正文,那么在邮件头中将类型扩大化,定义为multipart/related,甚至multipart/mixed,都是允许的。
multipart诸类型的共同特征是,在段头指定“boundary”参数字符串,段体内的每个子段以此串定界。所有的子段都以“--”+boundary行开始,父段则以“--”+boundary+“--”行结束。段与段之间也以空行分隔。在邮件体是multipart类型的情况下,邮件体的开始部分(第一个“--”+boundary行之前)可以有一些附加的文本行,相当于注释,解码时应忽略。
可以观察一下边界001、002、003等
提取pcapng中流量可以从wireshark中直接将邮件正文部分复制出来保存到文件中后缀改为.eml拿客户端打开。反正我觉得自己解析邮件中的文件太难了,取个巧。
base64
Base64的索引表,字符选用了"A-Z、a-z、0-9、+、/"
64个可打印字符。数值代表字符的索引,这个是标准Base64协议规定的,不能更改。64个字符用6个bit位就可以全部表示,一个字节有8个bit位,剩下两个bit就浪费掉了,这样就不得不牺牲一部分空间了。这里需要弄明白的就是一个Base64字符是8个bit,但是有效部分只有右边的6个bit,左边两个永远是0。
那么怎么用6个有效bit来表示传统字符的8个bit呢?8和6的最小公倍数是24,也就是说3个传统字节可以由4个Base64字符来表示,保证有效位数是一样的,这样就多了1/3的字节数来弥补Base64只有6个有效bit的不足。
我的邮件当中有那么一段
先用base64解码,然后用GB2312解码
需要注意的是根据RFC 822规定,每76个字符,还需要加上一个回车换行。所以字符串要手动去除回车换行。
参考:
https://zh.wikipedia.org/wiki/Base64
https://www.cnblogs.com/luguo3000/p/3940197.html
https://blog.csdn.net/bripengandre/article/details/2192982
pop3&smtp的更多相关文章
- POP3&SMTP&IMAP
[POP3&SMTP&IMAP] IMAP是什么? IMAP,即Internet Message Access Protocol(互联网邮件访问协议),您可以通过这种协议从邮件服务器上 ...
- 腾讯QQ企业邮箱POP3/SMTP设置
腾讯企业邮箱支持通过client进行邮件管理. POP3/SMTP协议 收发邮件server地址分别例如以下. 接收邮件server:pop.exmail.qq.com (port 110) 发送邮件 ...
- 常用邮箱的 IMAP/POP3/SMTP 设置
通过网上查找的资料和自己的总结完成了下面的文章,看完之后相信大家对这三种协议会有更深入的理解.如有错误的地方望指正. POP3 POP3是Post Office Protocol 3的简称,即邮局协议 ...
- 【转】常用邮箱的 IMAP/POP3/SMTP 设置
POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议.它是因特网电子邮件的第 ...
- 开启POP3/SMTP服务
实现发送邮件时需要先启用POP3/SMTP服务(以qq邮箱和网易邮箱启用为例) 一 qq邮箱启用 二.网易邮箱开启POP3/SMTP服务 至此:服务已开启
- 腾讯企业邮箱 POP3/SMTP 设置
下午魅族MX2刷完机,原先配置的公司邮箱还要重新配置.有些地方需要改,找到了篇文章,如下: 腾讯企业邮箱支持通过客户端进行邮件管理.POP3/SMTP协议收发邮件服务器地址分别如下.接收邮件服务器:p ...
- 设置POP3/SMTP协议 手机绑定邮箱
例如设置企业邮箱 一.设置POP3/SMTP协议,意思是代收邮件致本地POP3接收邮件服务器:pop.qiye.qq.comSMTP发送邮件服务器:smtp.qiye.qq.com二.设置IMAP/S ...
- Foxmail for windows 客户端设置和 IMAP、POP3/SMTP 的设置
Foxmail支持微信扫码.手机验证码.账号密码三种方式新建腾讯企业邮箱. 注意:目前仅foxmail 7.2.11版本支持微信扫码和手机验证码新建腾讯企业邮箱,可以foxmail官网https:// ...
- 常用邮件服务器名(POP3,SMTP地址)
POP3服务器地址:pop3.sina.com.cn(端口:110)SMTP服务器地址:smtp.sina.com.cn(端口:25) sina.cn: POP3服务器地址:pop3.sina.com ...
随机推荐
- 如何:使用 as 和 is 运算符安全地进行强制转换(C# 编程指南)
如何:使用 as 和 is 运算符安全地进行强制转换(C# 编程指南) 由于对象是多态的,因此基类类型的变量可以保存派生类型.若要访问派生类型的方法,需要将值强制转换回该派生类型.不过,在这些情况下, ...
- Linux下搭建一个nginx+2tomcat负载均衡环境(转)
一.安装tomcat 1.将tomcat安装包上传到Linux下: 2.解压2个tomcat,并分别修改名称: 1).解压命令:unzip 2).修改用户名:mv 3.分别修改两个tomcat的端口号 ...
- http-equiv属性的属性值X-UA-Compatible
参考:https://blog.csdn.net/changjiangbuxi/article/details/26054755
- Codeforces 598D:Igor In the Museum
D. Igor In the Museum time limit per test 1 second memory limit per test 256 megabytes input standar ...
- json序列化(重要)
(1)同(2)public JsonResult JsonUserGet() { DataSet ds = Web_User.P_LG_User_Get(nUserId); return Json(J ...
- 页面的五种布局以及嵌套『Android系列八』
转自:http://blog.csdn.net/dazlly/article/details/7860125 因为学习比较晚,我用的相关版本为SDK4.1.eclipse4.2,而自己看的教材都是低版 ...
- Activemq、Rabbitmq、Rocketmq、Kafka的对比
综上所述,各种对比之后,我个人倾向于是: 一般的业务系统要引入MQ,最早大家都用ActiveMQ,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃,所以大家还是算了吧,我个人 ...
- js获取cookie提取用户名asp.net+html
JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的. 而cookie是运行在客户端的,所以可以用JS来设置cookie. 假设有这样一 ...
- less在vscode中的配置方式
1.在vscode插件中下载easy less这个插件. 2.新建项目,分别建两个文件夹存放less和自动编译好的css,页面中引入文件引css就可以了. 3.根据你的文件位置,在用户设置中设置需要配 ...
- 使用自己定义的DIV的滚动条
基本思路: 让DIV浮动起来,利用postion:fixed/absolute,设定height:100% var $card=$("#cardDetail"); $ca ...