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工作在两种情况下

  1. 发件人客户端传输到服务器
  2. 邮件服务器向另一个邮件服务器传输邮件

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的更多相关文章

  1. POP3&SMTP&IMAP

    [POP3&SMTP&IMAP] IMAP是什么? IMAP,即Internet Message Access Protocol(互联网邮件访问协议),您可以通过这种协议从邮件服务器上 ...

  2. 腾讯QQ企业邮箱POP3/SMTP设置

    腾讯企业邮箱支持通过client进行邮件管理. POP3/SMTP协议 收发邮件server地址分别例如以下. 接收邮件server:pop.exmail.qq.com (port 110) 发送邮件 ...

  3. 常用邮箱的 IMAP/POP3/SMTP 设置

    通过网上查找的资料和自己的总结完成了下面的文章,看完之后相信大家对这三种协议会有更深入的理解.如有错误的地方望指正. POP3 POP3是Post Office Protocol 3的简称,即邮局协议 ...

  4. 【转】常用邮箱的 IMAP/POP3/SMTP 设置

    POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议.它是因特网电子邮件的第 ...

  5. 开启POP3/SMTP服务

    实现发送邮件时需要先启用POP3/SMTP服务(以qq邮箱和网易邮箱启用为例) 一 qq邮箱启用 二.网易邮箱开启POP3/SMTP服务 至此:服务已开启

  6. 腾讯企业邮箱 POP3/SMTP 设置

    下午魅族MX2刷完机,原先配置的公司邮箱还要重新配置.有些地方需要改,找到了篇文章,如下: 腾讯企业邮箱支持通过客户端进行邮件管理.POP3/SMTP协议收发邮件服务器地址分别如下.接收邮件服务器:p ...

  7. 设置POP3/SMTP协议 手机绑定邮箱

    例如设置企业邮箱 一.设置POP3/SMTP协议,意思是代收邮件致本地POP3接收邮件服务器:pop.qiye.qq.comSMTP发送邮件服务器:smtp.qiye.qq.com二.设置IMAP/S ...

  8. Foxmail for windows 客户端设置和 IMAP、POP3/SMTP 的设置

    Foxmail支持微信扫码.手机验证码.账号密码三种方式新建腾讯企业邮箱. 注意:目前仅foxmail 7.2.11版本支持微信扫码和手机验证码新建腾讯企业邮箱,可以foxmail官网https:// ...

  9. 常用邮件服务器名(POP3,SMTP地址)

    POP3服务器地址:pop3.sina.com.cn(端口:110)SMTP服务器地址:smtp.sina.com.cn(端口:25) sina.cn: POP3服务器地址:pop3.sina.com ...

随机推荐

  1. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:表示成功的操作

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. Codeforces 598E:Chocolate Bar

    E. Chocolate Bar time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  3. Android问题:ScrollView默认位置不是最顶部最全解决方案

    描述: Scrollview里面嵌套了一个listview ,这是开发中最寻常的一种布局,遇到的问题是:在这个Scrollview页面默认的起始位置不是最顶部,而是listview的底部. 原因: 在 ...

  4. 《C++ Primer(中文版)(第5版)》斯坦利·李普曼 (Stanley B. Lippman) (作者), 约瑟·拉乔伊 (Josee Lajoie) (作者), 芭芭拉·默 (Barbara E. Moo) (作者) azw3

    内容简介: 这本久负盛名的C++经典教程,时隔八年之久,终迎来的重大升级.除令全球无数程序员从中受益,甚至为之迷醉的——C++ 大师 Stanley B. Lippman 的丰富实践经验,C++标准委 ...

  5. P1435 回文字串(LCS问题)

    题目背景 IOI2000第一题 题目描述(题目链接:https://www.luogu.org/problem/P1435) 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成 ...

  6. k-近邻算法原理入门-机器学习

    //2019.08.01下午机器学习算法1——k近邻算法1.k近邻算法是学习机器学习算法最为经典和简单的算法,它是机器学习算法入门最好的算法之一,可以非常好并且快速地理解机器学习的算法的框架与应用.2 ...

  7. 对象内置的方法/内置的 Symbol 值

    内置的 Symbol 值 除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法. Symbol.hasInstance 对象的Symbo ...

  8. LeetCode347:返回频率前K高的元素,基于优先队列实现

    package com.lt.datastructure.MaxHeap; import java.util.LinkedList; import java.util.List; import jav ...

  9. Matplotlib 基本概念

    章节 Matplotlib 安装 Matplotlib 入门 Matplotlib 基本概念 Matplotlib 图形绘制 Matplotlib 多个图形 Matplotlib 其他类型图形 Mat ...

  10. SciPy 统计

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...