简介:

SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持,SMTP的重要特性之一是其能跨越网络传输邮件,即“SMTP邮件中继”。使用SMTP,可实现相同网络处理进程之间的邮件传输,也可通过中继器或网关实现某处理进程与其他网络之间的邮件传输

SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。可以很简单地通过telnet程序来测试一个SMTP服务器。SMTP使用TCP端口25,由于这个协议开始是基于纯ASCII文本的,它在二进制文件上处理得并不好。诸如MIME的标准被开发来编码二进制文件以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8位MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。

工作过程

SMTP协议的工作过程可分为如下3个过程:

(1)建立连接:在这一阶段,SMTP客户请求与服务器的25端口建立一个TCP连接。一旦连接建立,SMTP服务器和客户就开始相互通告自己的域名,同时确认对方的域名。

(2)邮件传送:利用命令,SMTP客户将邮件的源地址、目的地址和邮件的具体内容传递给SMTP服务器,SMTP服务器进行相应的响应并接收邮件。

(3)连接释放:SMTP客户发出退出命令,服务器在处理命令后进行响应,随后关闭TCP连接。

SMTP缺点

1)        命令过于简单,没提供认证等功能。

2)        只传送7位的ASCII码,不能传送二进制文件。

针对缺点1),标准化组织制定了扩充的SMTP(即ESMTP),对应的RFC文档为RFC1425。

针对缺点2),标准化组织在兼容SMTP的前提下,提出了传送非7位ASCII码的方法,对应的RFC文档有两个:邮件首部的扩充对应于RFC1522,邮件正文的扩充对应与RFC1521(即MIME)。

常用指令

SMTP中包含一些基本的命令用于客户端和服务器端进行交互,现列出一些常见的指令:

  • HELO <domain> <CRLF>。向服务器标识用户身份发送者能欺骗,说谎,但一般情况下服务器都能检测到。
  • AUTH LOGIN  使用AUTH LOGIN与服务器进行登录验证
  • MAIL FROM: <reverse-path> <CRLF>。<reverse-path>为发送者地址,此命令用来初始化邮件传输,即用来对所有的状态和缓冲区进行初始化。
  • RCPT TO:<forward-path> <CRLF>。 <forward-path>用来标志邮件接收者的地址,常用在MAIL FROM后,可以有多个RCPT TO。
  • DATA <CRLF>。将之后的数据作为数据发送,以<CRLF>.<CRLF>标志数据的结尾。
  • FROM    发信人显示信息(此处可以伪造身份,但是非常容易被识别)
  • TO         收件人显示信息
  • SUBJECT    邮件基本信息:邮件标题,不填写也往往容易被定位为垃圾邮件
  • REST <CRLF>。重置会话,当前传输被取消。
  • NOOP <CRLF>。要求服务器返回OK应答,一般用作测试。
  • QUIT <CRLF>。结束会话。
  • VRFY <string> <CRLF>。验证指定的邮箱是否存在,由于安全方面的原因,服务器大多禁止此命令。
  • EXPN <string> <CRLF>。验证给定的邮箱列表是否存在,由于安全方面的原因,服务器大多禁止此命令。
  • HELP <CRLF>。查询服务器支持什么命令

常见指令返回码说明

  • 211系统状态或系统帮助响应
  • 214帮助信息
  • 220<domain>服务就绪
  • 221<domain>服务关闭
  • 235    认证通过
  • 250要求的邮件操作完成
  • 251用户非本地,将转发向<forward-path>
  • 354 开始邮件输入,以"."结束,发送开始,往往与data指令结合
  • 421<domain>服务未就绪,关闭传输信道
  • 450要求的邮件操作未完成,邮箱不可用
  • 451放弃要求的操作;处理过程中出错
  • 452系统存储不足,要求的操作未执行
  • 500 指定错误
  • 501参数格式错误
  • 502命令不可实现
  • 503错误的命令序列
  • 504命令参数不可实现
  • 550要求的邮件操作未完成,邮箱不可用
  • 551用户非本地,请尝试<forward-path>
  • 552过量的存储分配,要求的操作未执行
  • 553邮箱名不可用,要求的操作未执行
  • 554操作失败

通讯流程示例

[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, MichaelI 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 ~]#

报文以只有一个“.”的行结束

注意事项

输入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 ~]#

邮件报文的封装和报文格式

SMTP协议可以将互联网邮件报文封装在邮件对象中。SMTP协议的邮件对象由两个部分组成:信封和内容。

  • 信封实际上是一种SMTP命令。
  • 邮件报文是邮件对象中的内容,它又有首部和主体两个部分。
    如下图就是一个邮件对象的组成的示例:

下面是写进了RFC文档的对报文格式的定义: 
 1. 所有报文都是由ASCII码组成
 2. 报文由报文行组成,各行之间用回车(CR)、换行(LF)符分隔
 3. 报文的长度不能超过998个字符
 4. 报文行的长度≤78个字符之内(不包括回车换行符)
 5. 报文中可包括多个首部字段和首部内容
 6. 报文可包括一个主体,主体必须用一个空行与其首部分隔
 7. 除非需要使用回车与换行符,否则报文中不使用回车与换行符

SMTP协议的扩展协议:MIME

MIME不属于一个邮件传输协议,它只是对SMTP的一个扩展,不能替代SMTP协议,至于为啥要替换SMTP了。主要是因为SMTP协议在传输报文时,只能够传输7位的ASCII格式的报文,不支持那些不使用7位ASCII格式的语种,同时它也不支持语音和视频数据的传输,因此我们需要一个辅助性协议帮忙传输报文,它就是MIME。

MIME协议定义了5种头部,用来加在原始的STMP头部,以便定义参数的转换。他们分别是:

1. MIME-Version:MIME版本
 2. Content-Type:内容类型
 3. Content-Tansfer-Encoding:内容传输编码
 4. Content-ID:内容标识
 5. Content-Description:内容描述

MIME 常见的类型:application、audio、image、message、text、video、x-world   详见:http://www.w3school.com.cn/media/media_mimeref.asp

  multipart类型
       MIME邮件中各种不同类型的内容是分段存储的,各个段的排列方式、位置信息都通过Content-Type域的multipart类型来定义。multipart类型主要有三种子类型:mixedalternativerelated
       ●  multipart/mixed类型
        如果一封邮件中含有附件,那邮件的Content-Type域中必须定义multipart/mixed类型,邮件通过multipart/mixed类型中定义的boundary标识将附件内容同邮件其它内容分成不同的段。基本格式如下:
Content-Type: multipart/mixed;
                 boundary="{分段标识}"

●  multipart/alternative类型
        MIME邮件可以传送超文本内容,但出于兼容性的考虑,一般在发送超文本格式内容的同时会同时发送一个纯文本内容的副本,如果邮件中同时存在纯文本和超文本内容,则邮件需要在Content-Type域中定义multipart/alternative类型,邮件通过其boundary中的分段标识将纯文本、超文本和邮件的其它内容分成不同的段。基本格式如下:
Content-Type: multipart/alternative;
                 boundary="{分段标识}"

●  multipart/related类型
         MIME邮件中除了可以携带各种附件外,还可以将其它内容以内嵌资源的方式存储在邮件中。比如我们在发送html格式的邮件内容时,可能使用图像作为 html的背景,html文本会被存储在alternative段中,而作为背景的图像则会存储在multipart/related类型定义的段中。基本格式如下:
Content-Type: multipart/related;
                 type="multipart/alternative";
                 boundary="{分段标识}"

multipart类型的boundary属性
  multipart的子类型中都定义了各自的boundary属性,邮件使用这些boundary中定义的字符串作为标识,将邮件内容分成不同的段,段体内的每个子段以“--”+boundary行开始,父段则以“--”+boundary+“--”行结束,不同段之间用空行分隔。

SMTP安全和垃圾邮件

最初的SMTP的局限之一在于它没有对发送方进行身份验证的机制。因此,后来定义了SMTP-AUTH扩展。

尽管有了身份认证机制,垃圾邮件仍然是一个主要的问题。但由于庞大的SMTP安装数量带来的网络效应,大刀阔斧地修改或完全替代SMTP被认为是不现实的。Internet Mail 2000就是一个替代SMTP的建议方案。

因此,出现了一些同SMTP工作的辅助协议。IRTF的反垃圾邮件研究小组正在研究一些建议方案,以提供简单、灵活、轻量级的、可升级的源端认证。最有可能被接受的建议方案是发件人策略框架协议。

smtp 协议 MIME协议相关推荐

  1. 【计算机网络】应用层 : 电子邮件 ( SMTP 协议 | MIME 协议 | POP3 协议 | IMAP 协议 | 基于万维网的电子邮件 )

    文章目录 一.电子邮件信息格式★ 二.电子邮件系统 组成 结构 ★ 三.SMTP 协议 ( 简单邮件传送协议 ) ★ 四.SMTP 协议 连接建立流程 五.SMTP 协议 邮件发送 流程 六.SMTP ...

  2. MIME协议及源邮件格式分析

    转载链接:http://wenku.baidu.com/view/7246de671ed9ad51f01df277.html 电子邮件也许是一个Internet上的流行最广泛的应用.也是我们现在的大多 ...

  3. MIME协议(三) -- MIME邮件的组织结构

    一封MIME邮件可以由多个不同类型的MIME消息组合而成,一个MIME消息表示邮件中的一个基本MIME资源或若干基本MIME消息的组合体.每个MIME消息的数据格式与RFC822数据格式相似,也包括头 ...

  4. 手机端php mime设置,php,_如何使用MIME协议配合表单在iphone手机上下载文件?,php - phpStudy...

    如何使用MIME协议配合表单在iphone手机上下载文件? 做了一个在线下载音乐网站的工具,使用PHP编写,包含MIME协议中的Content-type&Content-Disposition ...

  5. SMTP 和 POP3 协议的区别和联系

    SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol 3)是两种常用的电子邮件协议,用于发送和接收电子邮件.虽然它们都涉及到电子邮 ...

  6. java smtp pop3_手工体验smtp和pop3协议 邮件实现详解(二)

    上篇博客我们简单介绍了电子邮件的发送和接收过程,对参与其中的邮件服务器,邮件客户端软件,邮件传输协议也有简单的介绍.我们知道电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行传递必须 ...

  7. php iphone下载文件,如何使用MIME协议配合表单在iphone手机上下载文件?

    做了一个在线下载音乐网站的工具,使用PHP编写,包含MIME协议中的Content-type&Content-Disposition,测试了电脑,安卓都可以正常下载,代码如下(测试用的,代码排 ...

  8. 电子邮件(SMTP、MIME、POP3、IMAP)

    电子邮件是一种异步通信方式,通信时不需要双方在场.电子邮件把邮件发送到收件人使用的服务器,并放入收件人的收件箱种,收件人可以随时上网到自己使用的邮件服务器进行阅读. 电子邮件系统的组成结构 电子邮件系 ...

  9. 【计算机网络】传输层 : 总结 ( TCP / UDP 协议 | 寻址与端口 | UDP 协议 | TCP 协议特点 | TCP 连接释放 | TCP 流量控制 | TCP 拥塞控制 ) ★★★

    文章目录 一.传输层 TCP / UDP 协议 ★ 二.寻址端口号 ★ 三.UDP 协议特点 四.UDP 协议首部格式 五.UDP 校验 六.TCP 协议 特点 ★ 七.TCP 报文段首部格式 八.T ...

最新文章

  1. 这届 AI 预测欧洲杯冠军,通通被打脸
  2. python批量读取csv文件-Python读取/批量读取文件
  3. linux之变量的设置与显示
  4. 分布式与人工智能课程(part11)--绘制词云图
  5. Spartacus integration library 文件夹的设计
  6. LeetCode 979. 在二叉树中分配硬币(DFS)
  7. chromium之WebUI
  8. Android bug日志/错误收集
  9. 如何用计算机二进制进行计算,计算机如何实现二进制数据运算
  10. C#中.snk文件的作用
  11. Kafka的灵魂伴侣Logi-KafkaManger(4)之运维管控–集群运维(数据迁移和集群在线升级)
  12. 接口自动化场景用例——对象嵌套对象
  13. 网络撮合交易的大市场
  14. 关于opencv环境搭建问题:由于找不到opencv_world440d.dll,无法执行代码,重新安装程序可能会解决此问题
  15. 计算机毕业论文里的编程,计算机编程毕业论文正文
  16. 谈谈软件从业学习方向
  17. ARCGIS创建文件数据库-包括概念介绍
  18. 我们是冠军 恭喜ASTER.Y夺得2021极限冲层赛第二赛季全球总冠军
  19. 在Word2013中获取屏幕截图的方法
  20. 第七届NVIDIA Sky Hackathon项目报告书

热门文章

  1. Keil uvision 5 安装和使用
  2. android百度地图定位到非洲,解决办法
  3. 全链路压测的大概思路
  4. 单点登录 cas 设置回调地址_单点登录(SSO)看这一篇就够了
  5. R语言笔记之树模型(回归树和决策树)
  6. python傅里叶谐波分析_傅里叶变换及其谐波提取
  7. 华为机试题(Java)
  8. 逆向工程中常用软件分析工具
  9. win10隐藏任务栏_Win10美化指南 | 定制属于你的专属桌面,Windows也能玩出新花样...
  10. Hadoop及组件的安装