ESMTP协议与SMTP协议

系统 1605 0

ESMTP身份验证的机制有很多种,最常见的是LOGIN机制,类似于POP3的身份验证方式,即分两步输入账号和密码。在所有的验证机制中,信息全部采用Base64编码。

例如,用smtp.elong.com邮件服务器发送邮件,从开始连接到身份验证的过程如下(红色和蓝色分别代表客户端和服务器):

(连接到smtp.elong.com:25)
220sp1ESMTPv2.1
EHLOABCDEFG
250-smtp.elong.com
250-PIPELINING
250-SIZE20480000
250-ETRN
250-AUTHLOGINPLAINDIGEST-MD5CRAM-MD5(支持的身份验证机制种类:LOGIN,PLAIN等)
2508BITMIME
AUTHLOGIN
334VXNlcm5hbWU6(Base64解码后:Username:)
Ymh3YW5n(Base64编码前:bhwang)
334UGFzc3dvcmQ6(Base64解码后:Password:)
bXlwYXNzd29yZCFteXBhc3N3b3JkISE=(Base64编码前:********)
235Authenticationsuccessful

另外一种较常见的机制是PLAIN。与LOGIN机制的不同之处在于一次性输入账号和密码,格式为“<NUL>账号<NUL>密码”,其中<NUL>为字节0。用PLAIN机制代替上面的身份验证过程:

AUTHPLAIN
334
AGJod2FuZwBteXBhc3N3b3JkIW15cGFzc3dvcmQhIQ==(Base64编码前:<NUL>bhwang<NUL>********)
235Authenticationsuccessful

有的ESMTP服务器,例如采用CoreMail系统的smtp.163.com,smtp.163.net,smtp.tom.com,smtp.netease.com等,不回复334代码行,客户端在输入AUTHPLAIN后,直接输入符合格式要求的账号和密码即可。

LOGIN和PLAIN机制没有对账号和密码进行加密,相当于明文传输,Base64编码只是一层纸而已。DIGEST-MD5,CRAM-MD5,GSSAPI,KERBEROS_V4等身份验证机制能够加密传输内容。

 SMTP(Simple Mail TransferProtocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,或者说是由它来控制信件传输的一种中转方式。SMTP协议属于 TCP / IP 协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,我们就可以把Email寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转 电子邮件

  SMTP的开发最初是为了在封闭的网络中传送相对来说不太重要的简短邮件,而不是为了在互联网中传送重要而敏感的信息,因此最初通过SMTP传输邮件时,安全性不高。

SMTP协议常用命令集

1.SMTP是工作在两种情况下:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器
2.SMTP是个请求/响应 协议 ,命令和响应都是基于ASCII文本,并以CR和LF符结束。响应包括一个表示返回状态的三位数字代码
3.SMTP在TCP 协议 25号端口监听连接请求
4.连接和发送过程:
a.建立TCP连接
b.客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令服务器端正希望以OK作为响应,表明准备接收
c.客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行服务器端则表示是否愿意为收件人接受邮件
d.协商结束,发送邮件,用命令DATA发送
e. 以.表示结束输入内容一起发送出去
f.结束此次发送,用QUIT命令退出。
5.另外两个命令:
VRFY---用于验证给定的用户邮箱是否存在,以及接收关于该用户的详细信息。
EXPN---用于扩充邮件列表。

6.邮件路由过程:
  SMTP服务器基于‘域名服务DNS中计划收件人的域名来路由电子邮件。SMTP服务器基于DNS中的MX记录来路由电子邮件,MX记录注册了域名和相关的SMTP中继主机,属于该域的电子邮件都应向该主机发送。

若SMTP服务器mail.cnpaf.com收到一封信要发到 mail@cnpaf.net :

a.Sendmail请求DNS给出主机mail.cnpaf.net的CNAME记录,如有,假若CNAME到mail.cnpaf.net,则再次请求mail.cnpaf.net的CNAME记录,直到没有为止
b.假定被CNAME到mail.cnpaf.net,然后sendmail请求@abc.com域的DNS给出mail.cnpaf.net的MX记录
shmail    MX   5   mail.cnpaf.net
           0   shmail2.abc.com
c. Sendmail最后请求DNS给出mail.cnpaf.net的A记录,即IP地址,若返回值为1.2.3.4
d. Sendmail与1.2.3.4连接,传送这封给 mail@cnpaf.net 的信到1.2.3.4这台服务器的SMTP后台程序

7.SMTP基本命令集:

命令       描述
------------------------------
HELO      向服务器标识用户身份发送者能欺骗,说谎,但一般情况下服务器都能检测到。

MAIL      初始化邮件传输
          mail form :
RCPT      标识单个的邮件接收人;常在MAIL命令后面  可有多个rcpt to:
DATA      在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输结束。
VRFY      用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN      验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP      查询服务器支持什么命令
NOOP      无操作,服务器应响应OK
QUIT      结束会话
RSET      重置会话,当前传输被取消
--------------------------------

8. MAIL form 命令中指定的地址是称作 envelope form地址,不需要和发送者自己的地址是一致的。
RCPT TO 与之等同,指明的接收者地址称为envelope to地址,而与实际的to:行是什么无关。
9.为什么没有RCPT CC和RCPT BCC:?
   所有的接收者协商都通过RCPT TO命令来实现,如果是BCC,则协商发送后在对方接收时被删掉信封接收者
10.邮件被分为信封部分,信头部分和信体部分
   envelope form , envelope to 与message form:, message to:完全不相干。
   evnelope是由服务器主机间SMTP后台提供的,而message form /to是由用户提供的。有无冒号也是区别。

11. 怎样由信封部分检查是否一封信是否是伪造的?
a. received行的关联性。
   现在的SMTP邮件传输系统,在信封部分除了两端的内部主机处理的之个,考虑两个公司防火墙之间的部分,若两台防火墙机器分别为A和B,但接收者检查信封received:行时发现经过了C.则是伪造的。
b. received:行中的主机和IP地址对是否对应如:
   Receibed: form galangal.org (turmeric.com [104.128.23.115] by mail .bieberdorf.edu....
c. 被人手动添加在最后面的received行:
    Received: form galangal.org ([104.128.23.115]) by mail .bieberdorf.edu (8.8.5)
    Received: form  lemongrass.org by galangal.org (8.7.3)
    Received: form  graprao.com by lemongrass.org (8.6.4)


POP3命令列表:
一般telnet pop3Server110后就可以用这些命令了,大小写不敏感,不包括口令本身,注意不要让口令回显,等验证通过后再允许回显好了。

user username 认可
pass password 认可 执行成功则状态转换
apop name,digest 认可 一种安全传输口令的办法,执行成功导致状态转换,请参见RFC 1321
stat 处理 请求server回送邮箱统计资料,如邮件数、邮件总字节数
uidl n 处理 server返回用于该指定邮件的唯一标识,如果没有指定,返回所有的
list n 处理 server返回指定邮件的大小等
retr n 处理 server返回邮件的全部文本
dele n 处理 server标记删除,quit命令执行时才真正删除
rset 处理 撤消所有的dele命令
top n,m 处理 返回n号邮件的前m行内容,m必须是自然数
noop 处理 server返回一个肯定的响应
quit client希望结束会话。如果server处于'处理'状态,则现在进入'更新'状态,删除那些标记成删除的邮件。如果server处于'认可'状态,则结束会话时server不进入'更新'状态

关于apop命令

如果client使用user命令,口令将是明文。使用apop命令时,client第一次与server连接时,server向client发送一个ascii码问候,该问候由一个字符串组成,它对于每个client的连接都是唯一的,client把它的纯文本口令附加到从server接收到的字符串之后,然后计算结果字符串的MD5摘要,client把username和MD5摘要作为apop命令的参数一起发送出去。

telnet pop3Server 110
user username
pass ****
stat
list
retr 1
retr 2
...
dele 1
dele 2
...
quit

SMTP 命令简介

什么是 SMTP
SMTP (Simple Mail Transfer Protocol) :电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请求/响应协议,命令和响应都是基于ASCII 文本,并以 CR 和 LF 符结束。响应包括一个表示返回状态的三位数字代码。SMTP 在 TCP 协议 25端口监听连接请求。

什么是 ESMTP
ESMTP (Extended SMTP),顾名思义,扩展 SMTP 就是对标准 SMTP 协议进行的扩展。它与 SMTP服务的区别仅仅是,使用 SMTP 发信不需要验证用户帐户,而用 ESMTP发信时,服务器会要求用户提供用户名和密码以便验证身份。验证之后的邮件发送过程与 SMTP 方式没有两样。

SMTP 命令
SMTP 命令包括:
HELO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
EHLO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
MAIL FROM 命令中指定的地址是发件人地址
RCPT TO 标识单个的邮件接收人;可有多个 RCPT TO;常在 MAIL 命令后面。
DATA 在单个或多个 RCPT 命令后,表示所有的邮件接收人已标识,并初始化数据传输,以 CRLF.CRLF 结束
VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP 查询服务器支持什么命令
NOOP 无操作,服务器应响应 OK
RSET 重置会话,当前传输被取消
QUIT 结束会话

连接 Winmail Server 使用 SMTP 命令发送邮件
例如:安装 Winmail 的邮件服务器IP是192.168.0.1 (蓝色字体内容由客户端输入,红色字体内容是服务返回的)

telnet 192.168.0.1 25 --------------------------------------- 使用 telnet 命令连接服务器 25端口
Trying 192.168.0.1... --------------------------------------- 正在连接服务器 25 端口
Connected to 192.168.0.1. ----------------------------------- 连接服务器 25 端口成功
220 Winmail Mail Server ESMTP ready ------------------------- 显示服务器的标识名称 (Winmail管理工具->高级设置->系统参数->基本参数中可更改)
helo cnu.com ------------------------------------------------向服务器标识用户身份,发信不要认证,跳过下面几步直接发送 mail from 命令
250 Winmail Mail Server
ehlo cnu.com ------------------------------------------------ ESMTP命令,发信需要认证。
250-Winmail Mail Server
250-PIPELINING
250-AUTH=LOGIN PLAIN
250-AUTH LOGIN PLAIN
250-SIZE 20480000
250 8BITMIME
auth login ------------------------------------------------- 进行用户身份认证
334 VXNlcm5hbWU6
Y29zdGFAYW1heGl0Lm5ldA== ----------------------------------- BASE64 加密后的用户名
334 UGFzc3dvcmQ6
MTk4MjIxNA== ----------------------------------------------- BASE64 加密后的密码
235 auth successfully -------------------------------------- 身份认证成功
( 535 auth failure ------------------------------------------ 身份认证失败)
发到本系统中域名下的账户可跳过身份认证。
mail from:<test1@domain.com> ------------------------------ mail from 地址 test1@domain.com
250 ok ----------------------------------------------------- 命令执行成功
rcpt to:<test2@domain.com> -------------------------------- 递送给地址 test2@domain.com
250 ok ----------------------------------------------------- 命令执行成功
data -------------------------------------------------------数据传输初始化
354 go ahead ----------------------------------------------- 开始传输数据
From: test1@domain.com
To: test2@domain.com
Date: Mon, 25 Oct 2004 14:24:27 +0800
Subject: test mail

Hi, test2
This is a test mail, you don't reply it.

.
------------------------------------------------------------数据内容,包括BASE64加密后的邮件内容, 以 CRLF.CRLF 结束数据传输
250 ok message accepted for delivery ----------------------- 命令执行成功
quit ------------------------------------------------------- 结束会话
221 Winmail MailServer
Connection closed by foreign host .------------------------- 断开连接

SMTP示例:


5.2.MailForwarding

WhenAlicesendsamessagetoBobathisalmamater.edu.example
account,theSMTPsessionfromherSUBMITservermightlooksomething
likethis:

S:220almamater.edu.exampleESMTPserverready
C:EHLOexample.com
S:250-almamater.edu.example
S:250-DSN
S:250-AUTH
S:250-SUBMITTER
S:250SIZE
C:MAILFROM:<alice@example.com>SUBMITTER=alice@example.com
S:250<alice@example.com>senderok
C:RCPTTO:<bob@almamater.edu.example>
S:250<bob@almamater.edu.example>recipientok
C:DATA
S:354okay,sendmessage
C:(messagebodygoeshere)
C:.
S:250messageaccepted
C:QUIT
S:221goodbye

Thealmamater.edu.exampleMTAmustnowforwardthismessageto
bob@company.com.example.Althoughtheoriginalsenderofthemessage
isalice@example.com,Aliceisnotresponsibleforthismostrecent
retransmissionofthemessage.Thatroleisfilledby
bob@almamater.edu.example,whoestablishedtheforwardingofmailto
bob@company.com.example.Therefore,thealmamater.edu.exampleMTA
determinesanewpurportedresponsibleaddressforthemessage,
namely,bob@almamater.edu.example,andsetstheSUBMITTERparameter
accordingly.TheforwardingMTAalsoinsertsaResent-Fromheaderin
themessagebodytoensurethepurportedresponsibleaddressderived
fromtheRFC2822headersmatchestheSUBMITTERaddress.

S:220company.com.exampleESMTPserverready
C:EHLOalmamater.edu.example
S:250-company.com.example
S:250-DSN
S:250-AUTH
S:250-SUBMITTER
S:250SIZE
C:MAILFROM:<alice@example.com>
SUBMITTER=bob@almamater.edu.example
S:250<alice@example.com>senderok
C:RCPTTO:<bob@company.com.example>
S:250<bob@company.com.example>recipientok
C:DATA
S:354okay,sendmessage
C:Resent-From:bob@almamater.edu.example
C:ReceivedBy:...
C:(messagebodygoeshere)
C:.
S:250messageaccepted
C:QUIT
S:221goodbye

5.3.MobileUser

Aliceisattheairportanduseshermobilee-maildevicetosenda
messagetoBob.Themessagetravelsthroughthecarriernetwork
providedbymobile.net.example,butAliceusesherexample.com
addressontheFromlineofallhermessagessothatrepliesgoto
herofficemailbox.

HereisanexampleoftheSMTPsessionbetweentheMTAsat
mobile.net.exampleandalmamater.edu.example.

S:220almamater.edu.exampleESMTPserverready
C:EHLOmobile.net.example
S:250-almamater.edu.example
S:250-DSN
S:250-AUTH
S:250-SUBMITTER
S:250SIZE
C:MAILFROM:<alice@example.com>
SUBMITTER=alice@mobile.net.example
S:250<alice@example.com>senderok
C:RCPTTO:<bob@almamater.edu.example>
S:250<bob@almamater.edu.example>recipientok
C:DATA
S:354okay,sendmessage
C:Sender:alice@mobile.net.example
C:ReceivedBy:...
C:(messagebodygoeshere)
C:.
S:250messageaccepted
C:QUIT
S:221goodbye

Notethatmobile.net.exampleusestheSUBMITTERparameterto
designatealice@mobile.net.exampleastheresponsiblesubmitterfor
thismessage.Further,thisMTAalsoinsertsaSenderheaderto
ensurethepurportedresponsibleaddressderivedfromtheRFC2822
headersmatchestheSUBMITTERaddress.

Likewise,conventionalISPsmayalsochoosetousetheSUBMITTER
parametertodesignateastheresponsiblesubmittertheuser’s
addressontheISP’snetworkifthataddressisdifferentfromthe
MAILFROMaddress.ThismaybeespeciallyusefulforISPsthathost
multipledomainsorotherwiseshareMTAsamongmultipledomains.

Whenthemessageissubsequentlyforwardedbythe
almamater.edu.exampleMTA,thatMTAwillreplacetheSUBMITTER
parameterwithbob@almamater.edu.exampleasinSection5.2andadd
itsownResent-Fromheader.

5.4.GuestE-MailService

Whileonabusinesstrip,Aliceusesthebroadbandaccessfacilities
providedbytheExemplarHoteltoconnecttotheInternetandsend
e-mail.Thehotelroutesalloutbounde-mailthroughitsownSMTP
server,email.hotel.com.example.

TheSMTPsessionforAlice’smessagetoBobfromtheExemplarHotel
wouldlooklikethis:

S:220almamater.edu.exampleESMTPserverready
C:EHLOemail.hotel.com.example
S:250-almamater.edu.example
S:250-DSN
S:250-AUTH
S:250-SUBMITTER
S:250SIZE
C:MAILFROM:<alice@example.com>
SUBMITTER=guest.services@email.hotel.com.example
S:250<alice@example.com>senderok
C:RCPTTO:<bob@almamater.edu.example>
S:250<bob@almamater.edu.example>recipientok
C:DATA
S:354okay,sendmessage
C:Resent-From:guest.services@email.hotel.com.example
C:ReceivedBy:...
C:(messagebodygoeshere)
C:.
S:250messageaccepted
C:QUIT
S:221goodbye

Notethatemail.hotel.com.exampleusestheSUBMITTERparameterto
designateagenericaccountguest.services@email.hotel.com.exampleas
theresponsiblesubmitteraddressforthismessage.Ageneric
accountisusedsinceAliceherselfdoesnothaveanaccountatthat
domain.Furthermore,thisclientalsoinsertsaResent-Fromheader
toensurethepurportedresponsibleaddressderivedfromtheRFC2822
headerswiththeSUBMITTERaddress.

Asbefore,whenthemessageissubsequentlyforwardedbythe
almamater.edu.exampleMTA,thatMTAwillreplacetheSUBMITTER
parameterwithbob@almamater.edu.exampleasinSection5.2andadd
itsownResent-Fromheader.

5.5.SUBMITTERUsedonaNon-DeliveryReport

Alicesendsanincorrectlyaddressede-mailmessageandreceivesa
non-deliveryreportfromaSUBMITTER-compliantserver.

S:220example.comESMTPserverready
C:EHLOalmamater.edu.example
S:250-example.com
S:250-DSN
S:250-AUTH
S:250-SUBMITTER
S:250SIZE
C:MAILFROM:<>SUBMITTER=mailer-daemon@almamater.edu.example
S:250OK
C:RCPTTO:<alice@example.com>
S:250OK
C:DATA
S:354OK,sendmessage
C:(messagebodygoeshere)
C:.
S:250messageaccepted
C:QUIT
S:221goodbye

SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP命令和接收SMTP反馈的应答来完成的。在通讯链路建立后,发送SMTP发送MAIL命令指令邮件发送者,若接收SMTP此时可以接收邮件则作出OK的应答,然后发送SMTP继续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响。双方如此反复多次,直至邮件处理完毕。SMTP协议共包含10个SMTP命令,列表如下:

  SMTP命令说明

  HELLO<domain><CRLF>识别发送方到接收SMTP的一个HELLO命令

  MAILFROM:<reverse-path><CRLF><reverse-path>为发送者地址。此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传输处理,最终完成将邮件数据传送到一个或多个邮箱中。

  RCPTTO:<forward-path><CRLF><forward-path>标识各个邮件接收者的地址

  DATA<CRLF>

  接收SMTP将把其后的行为看作邮件数据去处理,以<CRLF>.<CRLF>标识数据的结尾。

  REST<CRLF>退出/复位当前的邮件传输

  NOOP<CRLF>要求接收SMTP仅做OK应答。(用于测试)

  QUIT<CRLF>要求接收SMTP返回一个OK应答并关闭传输。

  VRFY<string><CRLF>验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命令。

  EXPN<string><CRLF>验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。

  HELP<CRLF>查询服务器支持什么命令

  注:<CRLF>为回车、换行,ASCII码分别为13、10(十进制)。

  SMTP协议的每一个命令都会返回一个应答码,应答码的每一个数字都是有特定含义的,如第一位数字为2时表示命令成功;为5表失败;3表没有完成。一些较复杂的邮件程序利用该特点,首先检查应答码的首数字,并根据其值来决定下一步的动作。下面将SMTP的应答码列表如下:

  应答码说明

  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操作失败

ESMTP协议与SMTP协议


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论