协议基础:SMTP:使用Telnet学习SMTP协议
协议基础:SMTP:使用Telnet学习SMTP协议
SMTP是简单邮件传输协议(Simple Mail Transfer Protocol)的缩写,这篇文章将通过如何使用telnet命令发生邮件结合RFC文档来学习一下SMTP协议的基础知识。
OSI模型 & SMTP
根据OSI7层或者5层的模型不同,各层常见的协议信息如下:
其实协议众多,这里借用一张来源与网络的整理结果用于展示OSI7层模型的常见协议的信息,包括应用层的SMTP/POP3/IMAP4
SMTP vs POP3 & IMAP4
SMTP和POP3以及IMAP都是用来做什么的,简单的来说,smtp主要负责发,pop3和imap主要负责收。
一封邮件的发&收的流程是通过SMTP进行发送,使用POP3或者IMAP4进行接收的。
SMTP RFC文档
SMTP的RFC初始版本是RFC 821,以下列出了SMTP相关的一部分RFC变化的列表
| RFC版本 | 时间 | 说明 | URL |
|---|---|---|---|
| RFC 821 | 1982/08 | 初始版本 | https://tools.ietf.org/html/rfc821 |
| RFC 974 | 1986/01 | 域名系统需求和实现相关 | https://tools.ietf.org/html/rfc974 |
| RFC 1035 | 1987/11 | 域名系统需求和实现相关 | https://tools.ietf.org/html/rfc1035 |
| RFC 1869 | 1995/11 | ESMTP规格扩展 | https://tools.ietf.org/html/rfc1869 |
| RFC 2841 | 2001/04 | - | https://tools.ietf.org/html/rfc2841 |
| RFC 5321 | 2008/10 | - | https://tools.ietf.org/html/rfc5321 |
SMTP模型
参看RFC5321,可以了解到SMTP的模型如下:
常用指令
SMTP中包含一些基本的命令用于客户端和服务器端进行交互,现列出一些常见的指令:
| 指令 | 说明 |
|---|---|
| HELO | 与服务器确认,通知其客户端使用的机器名称,一般邮件服务器不做限定 |
| AUTH | 使用AUTH LOGIN与服务器进行登录验证 |
| MAIL FROM | 发件人信息,填写与认证信息不同往往被定位为垃圾邮件或恶意邮件 |
| RCPT TO | 收信人地址 |
| DATA | 输入邮件基本信息 |
| FROM | 邮件基本信息:发信人显示信息(此处可以伪造身份,但是非常容易被识别) |
| FROM | 邮件基本信息:服务器收件人显示信息 |
| SUBJECT | 邮件基本信息:邮件标题,不填写也往往容易被定位为垃圾邮件 |
| QUIT | 断开链接 |
常见指令返回码说明
| 返回码 | 说明 |
|---|---|
| 220 | 服务就绪 |
| 250 | 请求动作成功完成 |
| 235 | 认证通过 |
| 221 | 处理中 |
| 354 | 发送开始,往往与data指令结合 |
| 500 | 指令错误 |
| 550 | 命令无法执行 |
基本流程
SMTP客户端与SMTP服务器端一个常见的流程如下所示:
TELNET
使用telnet可以使用SMTP指令与服务器端进行交互,不同的OS telnet的安装不同,比如:
| 操作系统 | 安装方式 |
|---|---|
| CENTOS | yum install telnet |
| MacOS | brew install telnet |
| Alpine | apk add busybox-extras(Alpine 3.7版本以后,之前包含在busybox中) |
验证
这里使用163的免费信箱进行mail发送试验,信息如下:
| 项目 | 说明 |
|---|---|
| 发送方 | devopsadmin@163.com |
| 接收方 | liumiaocn@outlook.com |
| 邮件标题 | confirm information |
邮件内容
Hi, Michael
I got your message.
Looking forward to meeting you.
Thanks & Best Regards.
- 1
- 2
- 3
- 4
- 5
- 6
操作日志
[root@platform ~]# telnet smtp.163.com 25
Trying 123.125.50.134...
Connected to smtp.163.com.
Escape character is '^]'.
220 163.com Anti-spam GT for Coremail System (163com[20141201])
HELO liumiao
250 OK
AUTH LOGIN
334 dXNlcm5hbWU6
ZGV2b3BzYWRtaW4=
334 UGFzc3dvcmQ6
密码的base64编码
235 Authentication successful
MAIL FROM:<devopsadmin@163.com>
250 Mail OK
RCPT TO:<liumiaocn@outlook.com>
250 Mail OK
DATA
354 End data with <CR><LF>.<CR><LF>
FROM: devopsadmin@163.com
To: liumiaocn@outlook.com
Subject: confirm information
Hi, Michael
I got your message.
Looking forward to meeting you.
Thanks & Best Regards.
.
250 Mail OK queued as smtp4,DtGowAAHhSrBwV5bL3XJAA--.5571S2 1532936690
Connection closed by foreign host.
[root@platform ~]#
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
邮件接收
操作说明
注意事项
输入AUTH LOGIN之后需要输入用户名和密码进行登录,登录时注意如下事项
- 登录名称为@之前的内容的base64编码,比如devopsadmin@163.com为devopsadmin的base64编码
- base64编码基本等于明码,但是使用的过程中请注意是否包含回测换行符号,比如devopsadmin的base64编码生成:echo -n “devopsadmin” |base64
- 密码不是邮箱的密码,网易的话专门还有一个密码,请注意
- 邮件发送往往服务器端需要做设定,请确认相关的邮件服务器
- 垃圾邮件不同的邮件系统判断标准不同,一般正确将全部信息填完基本没有问题
base64编码的换行
请注意看一下如下代码包含换行与否的情况,认证通不过的时候,请注意检查
[root@platform ~]# echo -n "devopsadmin" |base64
ZGV2b3BzYWRtaW4=
[root@platform ~]# echo "ZGV2b3BzYWRtaW4=" |base64 -d
devopsadmin[root@platform ~]#
[root@platform ~]#
[root@platform ~]# echo "devopsadmin" |base64
ZGV2b3BzYWRtaW4K
[root@platform ~]# echo "ZGV2b3BzYWRtaW4K" |base64 -d
devopsadmin
[root@platform ~]#
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
DATA段
DATA段为mail的正文,在这里还可以设定FROM/TO,有些人会在这里试图改变设定来攥改发信的地址,比如那些垃圾邮件的发送者,基本上邮件系统都会在这里做防护。比如163的邮箱,反垃圾邮件的策略如下,对伪造邮件头或者其他方式的欺骗性手段都会进行判断:
1、收件人事先没有提出要求或者同意接收且无法拒收的;
2、使用或包括无效的或伪造的邮件头;
3、使用或包括伪造的、无效的或者不存在的域名;
4、利用任何技术伪造、隐藏或掩盖传输路径来源的识别信息;
5、使用任何方式生成欺骗性地址信息;
6、在没有获得第三方许可的情况下使用、中继或通过第三方的互联网设备;
7、主题行或内容包含错误、误导或虚假的信息;
8、违反了国家相关法律规定和网易服务条款。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
比如DATA部分的FROM/TO/Subject等不正常设定,你很容易会收到包含554 DT:SPM的信息:
554 DT:SPM 163 smtp4,DtGowABXwXYYqF5bzXrBAA--.5359S2 1532930131,please see http://mail.163.com/help/help_spam_16.htm?ip=61.152.164.43&hostid=smtp4&time=1532930131
- 1
以下为网易免费邮箱关于垃圾邮件相关的错误码:
•554 DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件;
•554 DT:SUM 信封发件人和信头发件人不匹配;
•554 IP is rejected, smtp auth error limit exceed 该IP验证失败次数过多,被临时禁止连接。请检查验证信息设置;
•554 HL:IHU 发信IP因发送垃圾邮件或存在异常的连接行为,被暂时挂起。请检测发信IP在历史上的发信情况和发信程序是否存在异常;
•554 HL:IPB 该IP不在网易允许的发送地址列表里;
•554 MI:STC 发件人当天内累计邮件数量超过限制,当天不再接受该发件人的投信。请降低发信频率;
•554 MI:SPB 此用户不在网易允许的发信用户列表里;
•554 IP in blacklist 该IP不在网易允许的发送地址列表里。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
PS:技术不是用来发送垃圾邮件或者欺骗性的邮件的,而且很多免费的资源往往本身具有公益性质,请不要利用别人没有关闭的门窗让互联网变得更加污浊,学习的时候也请给自己发信不要打扰别人。
参考文档
https://tools.ietf.org/html/rfc5321
http://help.163.com/09/1224/14/5RAB4VK500753VB8.html?servCode=6010330
http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html
协议基础:SMTP:使用Telnet学习SMTP协议的更多相关文章
- 【RL-TCPnet网络教程】第33章 SMTP简单邮件传输协议基础知识
第33章 SMTP简单邮件传输协议基础知识 本章节为大家讲解SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)的基础知识,方便后面章节的实战操作. (本 ...
- 通过telnet使用smtp协议发送邮件
smtp协议是一个简单的邮件传输协议,利用它我们可以将邮件发送给别人,这里将通过telnet这个程序利用smtp协议从网易向gmail发送一封邮件 网上不少有说使用telnet发送邮件的文章,我也看过 ...
- centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 使用邮箱系统 第三十一节课
centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 ...
- Linux学习(1)- TCP/IP网络协议基础
Linux学习(1)- TCP/IP网络协议基础 一.TCP/IP 简介 学习内容 TCP/IP(Transmission Control Protocol/Internet Protocol)是传输 ...
- 2019-9-23:渗透测试,基础学习,http协议数据包的认识,html css的认识,笔记
Burp suite功能模块Dashboard:扫描Proxy:拦截包,代理 drop:放弃Intruder:爆破Decoder:编码,解码repeater:重放comparer:比较 BP,prox ...
- 小白学习安全测试(一)——Http协议基础
Http协议基础 Web技术发展[http://www.cnblogs.com/ProgrammerGE/articles/1824657.html] 静态WEB[网页] 动态WEB 属于一种应用程序 ...
- TCP/IP协议学习(四) 协议概述
生活中有舒适区,借口成为懒惰的护身符,学习也有舒适区,逃避便是阻止进步的最大障碍. 经过半年多嵌入式方面的工作和学习,我提高了很多,但同时我也对自己所面临的问题逐渐清晰: 1. 偏于实践,理论基础不牢 ...
- TCP/IP网络协议基础知识集锦[转]
引言 本篇属于TCP/IP协议的基础知识,重点介绍了TCP/IP协议簇的内容.作用以及TCP.UDP.IP三种常见网络协议相关的基础知识. 内容 TCP/IP协议簇是由OSI七层模型发展而来的,之所以 ...
- TCP/IP网络协议基础
实验楼学习网络协议传送门 一.TCP/IP简介 TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电 ...
随机推荐
- 第四讲,数据目录表之导入表,以及IAT表
一丶IAT(地址表) 首先我们思考一个问题,程序加载的时候会调用API,比如我们以前写的标准PE 那么他到底是怎么去调用的? 它会Call 下边的Jmp位置 而Jmp位置则是对一个全局变量取内容. 看 ...
- Android 使用自定义Drawable 设置圆角矩形或者圆形图片
转自 Android Drawable 那些不为人知的高效用法 本文出自:[张鸿洋的博客] http://blog.csdn.net/lmj623565791/article/details/437 ...
- ASP.NET Core本身已经集成了一个轻量级的IOC容器
1.services.AddTransient<IApplicationService,ApplicationService>//服务在每次请求时被创建,它最好被用于轻量级无状态服务(如我 ...
- 体验三大JavaScript文件上传库(Uppy.js/Filepond/Dropzone)
最近发现了一个高颜值的前端上传组件Uppy.js,立即上手体验了一波,感觉还不错.然后又看到同类型的Filepond以及Dropzone.js,对比体验了一下,感觉都很优秀,但是在体验过程中,都遇到了 ...
- 表空间 oracle
--create table create table table_name ( column1 varchar2(20) not null, column2 number(8) not null, ...
- centos禁止root用户ssh远程登录
首先,我们要以root身份登录远程主机 vim指令编辑ssh配置文件,如 vim /etc/ssh/sshd_config 查找PermitRootLogin,把yes改为no 修改完配置需要重启ss ...
- eclipse导入项目后出现红色叉号的解决方案
对于一名程序员来说,我导入的项目在项目的名称上无端加了一个红色的叉号,虽然这个不友好的符号,对于我整个的项目运行没有任何影响,但是总让我觉得不舒服,大大的叉号写在我的项目的脑袋上,我心里能舒服吗?于是 ...
- 【SpringMVC】入门
一.概述 1.1 SpringMVC是什么 1.2 MVC在b/s系统的应用 1.3 SpringMVC 原理 二.入门程序 2.1 需求 2.2 引入依赖 2.3 前端控制器 2.4 springm ...
- Computer Vision_33_SIFT:Object recognition from local scale-invariant features——1999
此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...
- redis——持久化策略
4.2.2 持久 化方式(1 ) RDB 方式1. 什么是 RDB 方式?Redis Database(RDB),就是在指定的时间间隔内将内存中的数据集快照写入磁盘,数据恢复时将快照文件直接再读到内存 ...