`
laintoday
  • 浏览: 64271 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

SMTP概述

 
阅读更多

第1章.       SMTP 概述

1.1.  SMTP在邮件通信中的位置
SMTP,即简单邮件传送协议,所对应RFC文档为RFC821。同http等多数应用层协议一样,它工作在C/S模式下,用来实现因特网上的邮件传送。SMTP在整个电子邮件通信中所处的位置如图 1所示。
  1 电子邮件的通信过程
可以看出,SMTP是用来将客户机上的邮件传送到服务器上。这里的客户机是指某次连接中的发送方,服务器是指相应的接收方。在讲解发送邮件的整个通信过程前,先解释一下面几个术语。
1.2.  几个术语
1.2.1.   邮件
邮件是一种消息的格式,由信封、首部和正文组成。
信封上最重要的是收信人的地址。邮件服务器用这个地址将邮件发送到收信人所在的邮件服务器上。
首部是由用户代理或邮件服务器添加的一些信息。包括Received、Message-ID、From、Data、Reply-To、X-Phone、X-Mailer、To和Subject等字段。
正文是是发送用户发给接收用户报文的内容。RFC 822 规定正文为NVT ASCII文字行。
更为详细的说明,请参考RFC821和RFC822等协议。
1.2.2.   用户代理
用户代理UA(User Agent)是用户与电子邮件系统的交互接口,一般来说它就是我们PC机上的一个程序。Windows上常见的用户代理是Foxmail和Outlook Express。
用户代理提供一个好的用户界面,它提取用户在其界面填写的各项信息,生成一封符合SMTP等邮件标准的邮件,然后采用SMTP协议将邮件发送到发送端邮件服务器。
1.2.3.   邮件服务器
邮件服务器是电子邮件系统的核心,它用来发送和接收邮件。邮件服务器不同于普通PC的是它几乎是全天工作的,所以它可以在任何时候为用户提供服务,后面将提到这正是为什么需要邮件服务器的一个重要原因。很多ISP都提供免费的邮件服务器,如126提供smtp.126.com邮件服务器。
邮件服务器向其它邮件服务器转发邮件也是采用SMTP协议。
1.3.  邮件的收发过程
一般情况下,一封邮件的发送和接收过程如下。
1)          发信人在用户代理里编辑邮件,包括填写发信人邮箱、收信人邮箱和邮件标题等等。
2)          用户代理提取发信人编辑的信息,生成一封符合邮件格式标准(RFC822)的邮件。
3)          用户代理用SMTP将邮件发送到发送端邮件服务器(即发信人邮箱所对应的邮件服务器)。
4)          发送端邮件服务器用SMTP将邮件发送到接收端邮件服务器(即收信人邮箱所对应的邮件服务器)。
5)          收信人调用用户代理。用户代理用POP3协议从接收端邮件服务器取回邮件。
6)          用户代理解析收到的邮件,以适当的形式呈现在收信人面前。
第2章.       SMTP 详解
2.1.  通信过程
一个具体的SMTP通信(如发送端邮件服务器与接收端服务器的通信)的过程如下。
1)          发送端邮件服务器(以下简称客户端)与接收端邮件服务器(以下简称服务器)的25号端口建立TCP连接。
2)          客户端向服务器发送各种命令,来请求各种服务(如认证、指定发送人和接收人)。
3)          服务器解析用户的命令,做出相应动作并返回给客户端一个响应。
4)          2)和3)交替进行,直到所有邮件都发送完或两者的连接被意外中断。
从这个过程看出,命令和响应是SMTP协议的重点,下面将予以重点讲述。
2.2.  命令和响应
2.2.1.   格式
SMTP的命令不多(14个),它的一般形式是:COMMAND [Parameter] <CRLF>。其中COMMAND是ASCII形式的命令名,Parameter是相应的命令参数,<CRLF>是回车换行符(0DH, 0AH)。
SMTP的响应也不复杂,它的一般形式是:XXX Readable Illustration。XXX是三位十进制数;Readable Illustration是可读的解释说明,用来表明命令是否成功等。XXX具有如下的规律:以2开头的表示成功,以4和5开头的表示失败,以3开头的表示未完成(进行中)。
2.2.2.   一个例子
命令和响应的格式是语法,各命令和响应的意思则是语义,各命令和各响应在时间上的关系则是同步。下面将通过一个简单的SMTP通信过程来说明协议的这三个要素。
C:telnet smtp.126.com 25   /*  以telnet方式连接126邮件服务器 */
S:220 126.com Anti-spam GT for Coremail System (126com[071018]) /* 220为响应数字,其后的为欢迎信息,会应服务器不同而不同*/
C:HELO smtp.126.com /* HELO 后用来填写返回域名(具体含义请参阅RFC821),但该命令并不检查后面的参数 */
S:250 OK
C: MAIL FROM: bripengandre@126.com /* 发送者邮箱  */
S:250 … ./* “…”代表省略了一些可读信息 */
C:RCPT TO: bripengandre@smail.hust.edu.cn /* 接收者邮箱  */
S:250 … ./* “…”代表省略了一些可读信息 */
C:DATA /* 请求发送数据  */
S:354 Enter mail, end with "." on a line by itself
C:Enjoy Protocol Studing
C:.
S:250 Message sent
C:QUIT /* 退出连接  */
S:221 Bye
分析上面的过程可参考注释进行,这里要补充如下几点。
1)          “C:”开头的行(不包括"C:")是客户端的输入,而以“S:”开头的行(不包括"S:")则是服务器的输出。
2)          上述的命令并不一定会一次性成功,服务器会返回错误响应,客户端应该按照协议规定的时序,来输入后续的命令(或重复执行失败的命令,或重置会话,或退出会话等等)。
2.2.3.   常用命令
SMTP命令不区分大小写,但参数区分大小写,有关这方面的详细说明请参考RFC821。常用的命令如下。
HELO <domain> <CRLF>。向服务器标识用户身份发送者能欺骗,说谎,但一般情况下服务器都能检测到。
MAIL FROM: <reverse-path> <CRLF>。<reverse-path>为发送者地址,此命令用来初始化邮件传输,即用来对所有的状态和缓冲区进行初始化。
RCPT TO:<forward-path> <CRLF>。 <forward-path>用来标志邮件接收者的地址,常用在MAIL FROM后,可以有多个RCPT TO。
DATA <CRLF>。将之后的数据作为数据发送,以<CRLF>.<CRLF>标志数据的结尾。
REST <CRLF>。重置会话,当前传输被取消。
NOOP <CRLF>。要求服务器返回OK应答,一般用作测试。
QUIT <CRLF>。结束会话。
VRFY <string> <CRLF>。验证指定的邮箱是否存在,由于安全方面的原因,服务器大多禁止此命令。
EXPN <string> <CRLF>。验证给定的邮箱列表是否存在,由于安全方面的原因,服务器大多禁止此命令。
HELP <CRLF>。查询服务器支持什么命令。
2.2.4.   常用响应
常用的响应如下所示,数字后的说明是从英文译过来的。更详细的说明请参考RFC821。
501参数格式错误
502命令不可实现
503错误的命令序列
504命令参数不可实现
211系统状态或系统帮助响应
214帮助信息
220<domain>服务就绪
221<domain>服务关闭
421<domain>服务未就绪,关闭传输信道
250要求的邮件操作完成
251用户非本地,将转发向<forward-path>
450要求的邮件操作未完成,邮箱不可用
550要求的邮件操作未完成,邮箱不可用
451放弃要求的操作;处理过程中出错
551用户非本地,请尝试<forward-path>
452系统存储不足,要求的操作未执行
552过量的存储分配,要求的操作未执行
553邮箱名不可用,要求的操作未执行
354开始邮件输入,以"."结束
554操作失败
第3章.       SMTP 的扩充
3.1.  SMTP的缺点
从2.2.2的例子可以看出,SMTP至少还有如下缺点。
1)          命令过于简单,没提供认证等功能。
2)          只传送7位的ASCII码,不能传送二进制文件。
针对缺点1),标准化组织制定了扩充的SMTP(即ESMTP),对应的RFC文档为RFC1425。针对缺点2),标准化组织在兼容SMTP的前提下,提出了传送非7位ASCII码的方法,对应的RFC文档有两个:邮件首部的扩充对应于RFC1522,邮件正文的扩充对应与RFC1521(即MIME)。
3.2.  ESMTP
ESMTP最显著的地方是添加了用户认证功能。如果用户想使用ESMTP提供的新命令,则在初次与服务器交互时,发送的命令应该是EHLO而不是HELO。先来看一个例子。
C:telnet smtp.126.com 25   /*  以telnet方式连接126邮件服务器 */
S:220 126.com Anti-spam GT for Coremail System (126com[071018]) /* 220为响应数字,其后的为欢迎信息,会应服务器不同而不同*/
C:EHLO smtp.126.com /* 除了HELO所具有的功能外,EHLO主要用来查询服务器支持的扩充功能  */
S:250-mail
S:250-AUTH LOGIN PLAIN
S:250-AUTH=LOGIN PLAIN
S:250 8BITMIME /* 最后一个响应数字应答码之后跟的是一个空格,而不是'-' */
C:AUTH LOGIN /* 请求认证  */
S:334 dxNlcm5hbWU6  /* 服务器的响应——经过base64编码了的“Username”  */
C:Y29zdGFAYW1heGl0Lm5ldA== /* 发送经过BASE64编码了的用户名  */
S:334 UGFzc3dvcmQ6 /* 经过BASE64编码了的"Password:" */
C:MTk4MjIxNA==  /* 客户端发送的经过BASE64编码了的密码  */
S:235 auth successfully /* 认证成功  */
C: MAIL FROM: bripengandre@126.com /* 发送者邮箱  */
S:250 … ./* “…”代表省略了一些可读信息 */
C:RCPT TO: bripengandre@smail.hust.edu.cn /* 接收者邮箱  */
S:250 … ./* “…”代表省略了一些可读信息 */
C:DATA /* 请求发送数据  */
S:354 Enter mail, end with "." on a line by itself
C:Enjoy Protocol Studing
C:.
S:250 Message sent
C:QUIT /* 退出连接  */
S:221 Bye
对于这个例子有如下几点说明。
1)          只是一个示意性的过程,再输入用户名、密码时需采用base64编码,这需要专门的计算,所以在telnet终端上模拟比较麻烦。
2)          认证过程有很多种,有基于明文的认证,也有基于MD5加密的认证,这里给出的只是一个示意性的过程。
3)          EHLO对于具体服务器,响应会不同,关键字“8BITMIME”用来说明服务器是否支持正文中传送8位ASCII码,而以“X”开头的关键字都是指服务器自定义的扩充(还没纳入RFC标准)
更详细的说明,请参看RFC1425。
3.3.  邮件首部的扩充
首部通过两种编码方式来支持传送非7位ASCII码。它首先通过一个如下格式的编码字来表明所用的编码方式。
=?charset?encoding?encoded-text?text
charset是字符集规范。有效值是两个字符串us-ascii和iso-8859-x,其中x 是一个单个数字,例如iso-8859-1中的数字为“ 1
encoding是一个单个字符用来指定编码方法,支持两个值。
Q代表quoted-printable(可打印)编码。任何要发送的字符若其第8比特置1则被作为3个字符发送:第1个是字符是“=”,后面的两个字符对应于字符的十六进制表示。例如对于二进制码11111111,其对应的十六进制表示为“FF”,所以对应的编码位“=FF”。为了能够传输“=”,“=”的编码方式与第8比特置1的字符相同,因为其二进制代码为00111101,所以对应的编码为“=3D”。可以看出这种编码方式的开销达200%,所以只适合传送只含有少量非7位ASCII码的文本。
B代表base64编码。它的编码方法是先将二进制代码划分为一个24bit长的单元,然后将这24 bit单元划分为4个6 bit组。每个组按图 2所示的方法转换成ASCII码。
  2  base64映射表
可以看出这种映射方法是这样的:0-25依次映射成A-Z,26-51依次映射成a-z,52-61依次映射成数字0-9,然后62映射成+,63映射成/。
对于二进制代码01001001 00110001 01111001,先将其划分成4个6 bit组,即010010 0100011 000101 111001。接着按图 2所示的映射表,可得到base64编码为:STF5。可以看出,这种编码方式的开销是25%,相对quoted-printable编码来说,它更适合用来传送含大量非7位ASCII码的二进制文件。
3.4.  正文的扩充
正文的扩充主要是使正文不仅可以传输NVT ASCII字符,而且可以传输任意字符,对应的文档为RFC1511(即MIME)。
MIME全称为“Multiple Internet Mail Extensions”, 比较确切的中文名称为“多用途互联网邮件扩展”。它通过新增一些邮件首部字段、邮件内容格式和传送编码,使得其成为一种应用很广泛的可以传输多媒体的电子邮件规范。
更详细的说明请参看另一篇文章《MIME协议分析》和RFC1511。
第4章.       常见的疑问
4.1.  为什么需要SMTP服务器
一般的PC资源不够,处理能力不够,不可能全天候地连接在因特网上来收发邮件。所以使用SMTP服务器,可以让多个用户共用服务器,有效地降低了成本。
4.2.  SMTP和邮件格式的关系
如前所述,SMTP是客户机向服务器发送邮件时所使用的协议,其核心是2.2中所述的命令和响应,至于它命令和响应中所带的参数采用什么格式,则是依赖于其他标准的。例如DATA后所带的参数,则应遵循邮件格式标准RFC822.
SMTP和邮件格式的关系可用这么一个例子来说明。甲与乙书信往来,甲通过邮局向乙发信,邮局间转交邮件可看成使用了SMTP协议,至于书信的格式则会因为地区习惯等的不同而不同(中国人的书信格式和美国人的书信格式不同),这个书信格式则可看成是邮件格式标准。
应当认识到不能孤立地看待协议,各个协议之间往往存在着耦合关系,但为了分析方便,我们在具体叙述某个协议时,只能抓住主要矛盾——主要阐述单个协议。
4.3.  浏览器发送邮件用的什么协议
浏览器如IE、Maxthon可通过登陆用户邮箱,来收发邮件,这是怎样实现的?例如bripengandre@126.com可通过登陆www.126.com来收发邮件。
这个过程是这样的:bripengandre@126.com在www.126.com提供的邮件页面上填写的相应信息(如发信人邮箱、收信人邮箱等),通过http协议被提交给126服务器;126服务器根据这些信息组装一封符合邮件规范的邮件(就像用户代理一样);然后smtp.126.com通过SMTP协议将这封邮件发送到接收端邮件服务器。
可以看出,浏览器发送邮件只是用户代理的功能直接放到邮件服务器上去做了,至于邮件服务器间发送邮件还是采用的SMTP协议。我们看问题,如果有必要还是要适当地透过现象看本质。
4.4.  如何用实验验证SMTP的通信过程
1)          可以通过ethereal等协议分析软件来抓包分析协议。
2)          可以利用socket编程实现SMTP的通信过程。
3)          可以利用用户代理来查看一封邮件的原始编码。例如在Foxmail中,可以选择邮件列表右键菜单的“原始信息”进行查看。
第5章.       分析方案
ID
Protocol
Captured contents
user name
password
sender
receiver
subject
contents
attachments
4
smtp
 
  1   协议分析要求
表 1给出了协议分析要求。容易看出,获取各个字段是比较容易的。我们可以抓取客户端与服务器端的交互信息,然后根据各命令字或响应字来提取出我们想要的字段。例如,要获取user name,我们只需检测到服务器端要求客户端发送用户名这个时候,然后提取这之后客户端的发送信息即可。需要说明的是,虽然客户端与服务端交互的信息可能经过了编码或加密,但我们仍能够通过解码或解密来获得所需要的信息。

分享到:
评论

相关推荐

    sophos-sg-smtp-logparser:Sophos SG SMTP日志文件解析器-SSSLP-解析许多Sophos SG(UTM)SMTP日志文件,并概述了已发送和已接收的电子邮件

    Sophos SG SMTP日志文件解析器-SSSLP-解析许多 SMTP日志文件(未压缩或gzip压缩),并概述了已发送和已接收的电子邮件。 结果以两种格式打印到标准输出: CSV(默认)提供了CSV样式的通信伙伴及其相关邮件量(计数...

    smtp-tester:节点的SMTP测试器,接收消息并调用处理程序

    概述 smtp-tester是一个简单的smtp服务器,它接受连接,接收邮件,然后调用绑定到特定地址的回调。 安装 安装非常简单,只需安装npm模块: npm install smtp-tester 启动SMTP服务器 首先,要求smtp-tester: var...

    MailRipV2:改进的SMTP Checker SMTP Cracker,具有代理支持,收件箱测试和更多功能

    概述法律声明仅允许将以下代码用于教育目的! Mail.Rip v2不得在任何时间用于任何形式的非法活动或执法。 此限制适用于所有使用情况,无论是使用整个代码还是仅使用部分代码。 通过下载和/或使用此存储库的代码和/或...

    企业网络安全概述.pptx

    非法用户接入网络内部获取信息 SMTP POP3 WEB ERP OA 数据中心 随便就能接进来,查点机密 CRM 市场 研发 财务 企业网络安全概述全文共23页,当前为第5页。 外部网络攻击造成网络瘫痪 大量伪源IP访问请求 每秒上万个...

    kubernetes-postfix-relay-host:SMTP中继主机,用于处理来自集群内部的基于事务的电子邮件

    概述 该存储库包含Kubernetes配置文件和docker映像,可轻松为服务(例如SendGrid)设置SMTP中继。 背景 我们需要一个可以使用env vars配置的简单docker映像。 此外,通过提供备用的初始化脚本,可以轻松地覆盖该功能...

    MailHog:基于Web和API的SMTP测试

    概述MailHog是针对开发人员的电子邮件测试工具: 配置您的应用程序以使用MailHog进行SMTP传递在Web UI中查看消息,或使用JSON API检索消息(可选)将邮件释放到真实的SMTP服务器以进行传递安装手动安装。 然后以获取...

    邮件截取与还原课程设计

    A.SMTP协议 B.POP3协议 2.基本流程 一、截获部分 二、还原部分 3.关于电子邮件收发: (1)电子邮件概述 (2)Intrenet电子邮件系统基础 (3)BASE64编码简介 4、关于核心工具Java类中的Jpcap 四. 核心源代码 ...

    计算机网络课件ppt(概述+物理层+数据链路层+网络层+运输层+应用层)

    概述: 网络的定义和基本概念。计算机网络的发展历程和重要性。分布式系统和网络的关系。网络的类型和拓扑结构。 物理层: 数据在物理媒介上传输的基本原理和方式。介质的类型,如双绞线、光纤、无线信道等。调制...

    Android代码-一款Android手机短信转发APP。

    功能概述 总闸开关 在主页上面,关闭后不进行任何转发 自动转发短信至目标手机号 只需开启转发转发至短信,并且设置目标手机号就可实现自动转发。 自动转发短信至目标邮箱 开启转发至邮箱。 设置SMTP服务器(QQ、...

    LDAP应用概述与qmail+LDAP安装配置

    以及qmail和LDAP的整合,重点在于qmail的基本应用及其通过LDAPServer来进行Pop3认证的配置过程,对于其它诸如邮件网关、邮件虚拟域、邮件列表、SMTP认证等不做叙述。本文档假定qmail邮件服务器和OpenLDAP的LDAP...

    django 发送邮件和缓存的实现代码

    概述:Django中内置了邮件发送功能,发送邮件需要使用SMTP服务,常用的免费服务器有:163、126、QQ 注册并登陆163邮箱 打开POP3/SMTP服务与IMAP/SMTP服务 重置授权密码 配置 #邮件发送 EMAIL_BACKEND='django....

    建立基于Linux的邮件服务器.doc

    电子邮件服务的概述 1. 电子邮件服务 电子邮件服务是Internet最基本的服务,电子邮件可以用来在Intern et或Intranet上进行信息的传递和交流,具有快速、经济的特点。 发一份电子邮件给远在他方的用户,通常来说,...

    基于ASP的在线邮件收发系统研究论文设计

    本文首先概括性的介绍电子邮件系统软件的发展趋势及其电子邮件收发系统应用到相关知识,SMTP协议等基本概念以及ASP概述。从ASP技术分析着手,分析利用ASP技术对本系统设计开发的过程。描述电子邮件收发系统的开发...

    防火墙与因特网安全 网络安全

    2.4.1 SMTP 21 2.4.2 telnet 23 2.4.3 网络时间协议 24 2.4.4 查找(用户信息) 25 2.5 基于RPC的协议 25 2.5.1 RPC和portmapper 25 2.5.2 NIS 28 2.5.3 NFS 28 2.5.4 AFS 29 2.6 文件传输协议 30 2.6.1 TFTP 30 ...

    C#毕业设计_邮件收发管理系统

    功能概述 此次设计我们将以国内久负盛名的FoxMail电子邮件客户端软件为范本来主要是实 现发送邮件,接受邮件这两个最基本但是也最重要的功能,以及其他的发送附件,发送 多媒体附件,实现代理服务器登录SMTP服务器,...

    C#.NET快速入门教程(PPT理论+示例精讲)

    第01章 C#.NET概述 第02章 C#数据类型 第03章 C# 语 句 第04章 类 第05章 继承、多态、委托与事件 第06章 设计窗体和控件 第07章 ADO.NET与数据操作 第08章 ASP.NET Web应用程序开发 第09章 网络协议与套接字编程 ...

    沈雨祥的实习报告.doc

    生产实习个人总结报告 姓 名: 沈雨祥 学 号: 04008030 实习单位: 东南大学信息安全研究中心 实习日期: 2011-06-20——2011-07-20 指导老师: 胡爱群 目录 IBE(Identity Based Encryption)简介 3 原理概述: 3 ...

    很全很详细的C#电子教案

    第01章 C#.NET概述 第02章 C#数据类型 第03章 C# 语 句 第04章 类 第05章 继承、多态、委托与事件 第06章 设计窗体和控件 第07章 ADO.NET与数据操作 第08章 ASP.NET Web应用程序开发 第09章 网络协议与套接字编程 ...

    Visual C#网络编程技术与实践源代码

    第1章 C#.NET网络编程概述  1.1 网络通信概述  1.1.1 网络通信模型概述  1.1.2 网络通信协议、接口和服务概述  1.1.3 TCP/IP网络架构概述  1.1.4 IP地址与端口  1.2 C#.NET网络编程相关类  1.2.1 IP...

    Nginx+FastCGI(PHP)+MYSQL配置

    1.1 nginx 概述 nginx 简介 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”, 是一个高性 能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor...

Global site tag (gtag.js) - Google Analytics