协议基础:SMTP:使用Telnet学习SMTP协议

2018-07-30 20:05:50 liumiaocn 阅读数 7479更多

分类专栏: 工具 Unix/Linux
 
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

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服务器端一个常见的流程如下所示:

SMTP客户端SMTP客户端SMTP服务器端SMTP服务器端HELO 机器名(SMTP服务器,这是我的机器名)250 OK我要登录:输入用户名/密码AUTH LOGIN334 返回码(eg:dXNlcm5hbWU6)邮箱登录名的base64编码334 返回码(eg:UGFzc3dvcmQ6)登录密码base64编码235 Authentication successful设定发信人地址MAIL FROM:<发信人地址eg:devopsadmin@163.com>250 Mail OK设定收信人地址RCPT TO:<收信人地址eg:liumiaocn@outlook.com>250 Mail OK我要写信了DATA354 End data with <CR><LF>.<CR><LF>设定From/To/Subject/信件内容,最后以.结束好的,给你发信250 Mail OK

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

  1. 【RL-TCPnet网络教程】第33章 SMTP简单邮件传输协议基础知识

    第33章      SMTP简单邮件传输协议基础知识 本章节为大家讲解SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)的基础知识,方便后面章节的实战操作. (本 ...

  2. 通过telnet使用smtp协议发送邮件

    smtp协议是一个简单的邮件传输协议,利用它我们可以将邮件发送给别人,这里将通过telnet这个程序利用smtp协议从网易向gmail发送一封邮件 网上不少有说使用telnet发送邮件的文章,我也看过 ...

  3. centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 使用邮箱系统 第三十一节课

    centos   邮件服务  腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25  收邮件协议:pop3 端口110  iredmail安装配置 ...

  4. Linux学习(1)- TCP/IP网络协议基础

    Linux学习(1)- TCP/IP网络协议基础 一.TCP/IP 简介 学习内容 TCP/IP(Transmission Control Protocol/Internet Protocol)是传输 ...

  5. 2019-9-23:渗透测试,基础学习,http协议数据包的认识,html css的认识,笔记

    Burp suite功能模块Dashboard:扫描Proxy:拦截包,代理 drop:放弃Intruder:爆破Decoder:编码,解码repeater:重放comparer:比较 BP,prox ...

  6. 小白学习安全测试(一)——Http协议基础

    Http协议基础 Web技术发展[http://www.cnblogs.com/ProgrammerGE/articles/1824657.html] 静态WEB[网页] 动态WEB 属于一种应用程序 ...

  7. TCP/IP协议学习(四) 协议概述

    生活中有舒适区,借口成为懒惰的护身符,学习也有舒适区,逃避便是阻止进步的最大障碍. 经过半年多嵌入式方面的工作和学习,我提高了很多,但同时我也对自己所面临的问题逐渐清晰: 1. 偏于实践,理论基础不牢 ...

  8. TCP/IP网络协议基础知识集锦[转]

    引言 本篇属于TCP/IP协议的基础知识,重点介绍了TCP/IP协议簇的内容.作用以及TCP.UDP.IP三种常见网络协议相关的基础知识. 内容 TCP/IP协议簇是由OSI七层模型发展而来的,之所以 ...

  9. TCP/IP网络协议基础

    实验楼学习网络协议传送门 一.TCP/IP简介 TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电 ...

随机推荐

  1. IntelliJ IDEA 之 配置JDK 的 4种方式

    一.新建项目前配置JDK 打开IDEA集成开发环境工具,点击:File--Project Structure,如下图 在打开的页面中,选择SDKs属性,并点击中间的加号+,选择JDK,如下图 在打开的 ...

  2. Abp 添加权限项<一>

    1.下载代码,数据库迁移,npm install 2.添加权限项: public static class PermissionNames { public const string Pages_Te ...

  3. Deep Learning方向的paper

    转载 http://hi.baidu.com/chb_seaok/item/6307c0d0363170e73cc2cb65 个人阅读的Deep Learning方向的paper整理,分了几部分吧,但 ...

  4. spring cloud Eureka 配置信息

    Eureka instance 一个服务,如:订单系统,会部署多台服务器,而每台服务器上提供的服务就是instance; 负载配置. Eureka service 指的是服务,提供一种特定功能的服务, ...

  5. 一次腾讯云centos服务器被入侵的处理

    昨天一大早,我还没到公司呢,就收到腾讯云安全中心发来的服务器异常登录告警,登录控制台一看,ip还是美国的,一脸懵逼.由于本人之前也没有过处理服务器入侵的经验,而且这台服务器目前还没有部署商用系统,所以 ...

  6. nginx和PHP之间的通信

    如果程序员a和B在windows上开发代码,它们可以被分离到不同的服务器,因为nginx和PHP之间的通信是基于TCP fastcgi协议的我们可以在程序员的windows pc上安装nginx,使用 ...

  7. oracle exists和 not exists 的用法

    比如 a,b 关联列为 a.id = b.id,现在要取 a 中的数据,其中id在b中也存在: select * from a where exists(select 1 from b where b ...

  8. 【外网不好用】可以尝试添加dns即可解决上不去外网的问题。

    可以将IPv4这里的DNS修改成以下内容再尝试上网试试.

  9. 图像处理库GPUImage简单使用

    一.介绍 GPUImage是一个基于OpenGL ES 2.0的开源的图像处理库,作者是Brad Larson.GPUImage将OpenGL ES封装为简洁的Objective-C或Swift接口, ...

  10. 如何对SAP Leonardo上的机器学习模型进行重新训练

    Jerry之前的两篇文章介绍了如何通过Restful API的方式,消费SAP Leonardo上预先训练好的机器学习模型: 如何在Web应用里消费SAP Leonardo的机器学习API 部署在SA ...