LinkNemo





Nemo博客

路漫漫其修远兮,吾将上下而求索。

  1. 博客主页
  2. 最新文章
  3. SMTP协议详解

SMTP协议详解

1. 简介

     SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,尽管邮件服务器可以用SMTP发送、接收邮件,但是邮件客户端只能用SMTP发送邮件,接收邮件一般用IMAP 或者 POP3 。邮件客户端使用TCP的25号端口与服务器通信。

    SMTP在1982年首次被定义在  RFC 821 ,在2008它被更新为扩展的SMTP协议,补充在文件 RFC 5321 ,扩展的协议是目前使用最广泛的协议。

2. SMTP 模型

20180527095947433

SMTP被设计基于以下交流模型:当用户需要发邮件时候,邮件发送者(sender-SMTP)建立一个与邮件接收者(receiver-SMTP)通信的通道,发送者发送SMTP命令给接收者,接收者收到后对命令做回复。

通信通道被建立后,发送者发送 MAIL 命令来指定发送者的邮件,如果接受者接收这个邮件,就回复 OK ,接着发送者发送 RCPT命令来指定接收者的邮箱,如果被接收同样回复OK,如果不接受则拒绝(不会终止整个通话)。接收者邮箱确定后,发送者用DATA命令指示要发送数据,并用一个 .  结束发送。如果数据被接收,会收到OK ,然后用QUIT结束会话。

3. SMTP 步骤

这里有三个步骤对于mail事务,第一步用 MAIL 命令给出发送者的身份,第二步用一个或者多个RCPT命令给出接收者信息,接着用DATA命令给出邮件数据。

第一步是MAIL命令,<reverse-path>包含发送者邮箱( <SP>是空格,<CRLF>是回车换行)

MAIL <SP> FROM:<reverse-path> <CRLF>

这个命令告诉接收者,开始一个新的邮件事务,重置所有的状态表和缓存区,包括接受者信息和邮件数据,<reverse-path>被用于报告错误,如果命令被接受,返回250 OK

第二步是 RCPT命令

RCPT <SP> TO:<forward-path> <CRLF>

这个命令提供一个接收者邮箱,如果被接受返回250 OK,如果不能被识别,返回550 Failure,这个第二步可以被重复多次。

第三步是 DATA命令

DATA <CRLF>

如果被接受,返回354,并认为所有后续行都会邮件数据信息。当收到文本结束符时候,返回250OK

邮件数据的末尾必须被指明,为了激活命令和回复的对话。通过发送只包含一个英文句号的行,来提示邮件数据结束。

请注意: 邮件数据(mail data)包含邮件头部关键字,如Date, Subject, To, Cc, From

下面的例子演示一下这些命令的使用(S: send发送,R:reply 回复)

S: MAIL FROM:<Smith@Alpha.ARPA>

R: 250 OK

S: RCPT TO:<Jones@Beta.ARPA>

R: 250 OK

S: RCPT TO:<Green@Beta.ARPA>

R: 550 No such user here

S: RCPT TO:<Brown@Beta.ARPA>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: <CRLF>.<CRLF>

R: 250 OK

Jones and Brown可以收到邮件,Green邮箱无效不能收到邮件。

4. 传输通道的打开与关闭

下面两个命令用于打开关闭传输通道

HELO <SP> <domain> <CRLF>

QUIT <CRLF>

HELO命令用主机介绍它自己,可以被翻译为"Hello, I am<domain>".

5.  SMTP命令汇总

HELO <SP> <domain> <CRLF>

EHLO <SP> <domain /address-literal > <CRLF>  新标准用于替换 HELO 命令

MAIL <SP> FROM:<reverse-path> <CRLF>

RCPT <SP> TO:<forward-path> <CRLF>

DATA <CRLF>

RSET <CRLF>

SEND <SP> FROM:<reverse-path> <CRLF>

SOML <SP> FROM:<reverse-path> <CRLF>

SAML <SP> FROM:<reverse-path> <CRLF>

VRFY <SP> <string> <CRLF>

EXPN <SP> <string> <CRLF>

HELP [<SP> <string>] <CRLF>

NOOP <CRLF>

QUIT <CRLF>

TURN <CRLF>

命令语义:

SMTP命令由四个不区分大小写的字母组成,如果命令带参数,则用空格与参数隔开,命令用回车换行结尾<CRLF>。

EHLO(Extended hello)or  HELO(hello)

这个命令用于说明自己是SMTP客户端身份,参数包含客户端的域名(domain)。其中EHLO是SMTP补充协议( RFC 5321 )中用于替换HELO命令的新命令,协议规定服务器支持EHLO命令的时候,尽量使用EHLO命令,为了兼容以前的版本,要求服务器继续支持HELO命令。如果收到回复OK,说明发送者和接收者处于初始状态,所有的状态表和缓存区都被清零。

MAIL

这个命令的参数是发送者邮箱<reverse-path>,参数中有 FROM 关键字,这个命令会清空之前的发送者邮箱(the reverse-path buffer)、接收者邮箱(forward-path buffer)和邮件数据(the mail data buffer)。

RCPT (recipient)

用于指定一个邮件接收者,参数中有TO 关键字,指定多个接收者通过重复使用这个命令。

DATA 

这个命令没有参数,告诉服务器接着要发送邮件内容。

邮件内容包含邮件标题项(message header section )和邮件正文(message body),

标题项(Header Fields )是以项目名(field name)为行的起点,接着是冒号(":"),跟着是内容(field body)以回车换行结束(CRLF),下面是标题项的例子

From: Bob@example.com 

To: Alice@example.com

Cc: theboss@example.com 

subject: subject 

其中From、To、Cc、subject就是项目名,冒号后是内容。邮件的标题区与正文区需要用一个空行隔开。两者共同组成DATA命令的参数,正文区用只有一个点字符“.”的单行来结束。

SEND 

初始化邮件事务,邮件数据被转发到一个或多个终端。

SOML(SEND OR MAIL)

初始化邮件事务,邮件数据被转发到一个或多个终端或邮箱。

SAML(SEND AND MAIL)

初始化邮件事务,邮件数据被转发到一个或多个终端和邮箱。

RSET(RESET)

这个命令用来终止邮件事务(mail transaction),任何已经存储的发送者、接收者、邮件数据(mail data)信息都被丢弃,缓存区被清零。

VRFY(VERIFY) 

验证邮箱是否存在,如果参数是用户名,则返回一个全名(如果存在)。

EXPN(EXPAND) 

验证邮箱列表

HELP

返回帮助信息,带参数时候,返回指定的帮助信息。

NOOP  

这个命令指示服务器收到命令后不用回复 “OK”

QUIT  

关闭传输通道。

TURN  

交换邮件发送者和接收者的角色,这个命令用在建立连接成本高的时候,TCP连接不用这个命令。这个命令会产生安全问题,只有在服务器可以被授权作为客户端时候才能用。

6.  新标准rfc5321弃用的命令

20180528115936392

--------------------- 



原文:https://blog.csdn.net/sinat_36219858/article/details/71069515?utm_source=copy 


评论

About ME

Nemo

Nemo

欢迎使用这个博客!如果您在使用的过程中有好的建议或者遇到问题,欢迎给我留言~

Other ME

性别:男

生日:1993-01-01

所在城市:深圳市

工作职务:菜鸟工程师

创建时间:2015/12/31 02:13:14

My SUMMARY

我的文章:379

我的留言:44

我的粉丝:45

我的关注:128

我的点击:387833

么么哒