SMTP协议详解

1. 简介

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

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

2. SMTP 模型

SMTP协议详解_第1张图片

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

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

3. SMTP 步骤

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

第一步是MAIL命令,包含发送者邮箱( 是空格,是回车换行

  • MAIL FROM:

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

第二步是 RCPT命令

  • RCPT TO:

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

第三步是 DATA命令

  • DATA

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

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

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

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

S: MAIL FROM:
R: 250 OK
S: RCPT TO:
R: 250 OK
S: RCPT TO:
R: 550 No such user here
S: RCPT TO:
R: 250 OK
S: DATA
R: 354 Start mail input; end with .
S: Blah blah blah...
S: ...etc. etc. etc.
S: .
R: 250 OK

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

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

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

  • HELO
  • QUIT

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

5.  SMTP命令汇总

  • HELO
  • EHLO address-literal >  新标准用于替换 HELO 命令
  • MAIL FROM:
  • RCPT TO:
  • DATA
  • RSET
  • SEND FROM:
  • SOML FROM:
  • SAML FROM:
  • VRFY
  • EXPN
  • HELP [ ]
  • NOOP
  • QUIT
  • TURN

命令语义:

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

  1. EHLO(Extended helloor  HELO(hello)
    这个命令用于说明自己是SMTP客户端身份,参数包含客户端的域名(domain)。其中EHLO是SMTP补充协议( RFC 5321 )中用于替换HELO命令的新命令,协议规定服务器支持EHLO命令的时候,尽量使用EHLO命令,为了兼容以前的版本,要求服务器继续支持HELO命令。如果收到回复OK,说明发送者和接收者处于初始状态,所有的状态表和缓存区都被清零。
  2. MAIL
    这个命令的参数是发送者邮箱,参数中有 FROM 关键字,这个命令会清空之前的发送者邮箱(the reverse-path buffer)、接收者邮箱(forward-path buffer)和邮件数据(the mail data buffer)。
  3. RCPT (recipient)
    用于指定一个邮件接收者,参数中有TO 关键字,指定多个接收者通过重复使用这个命令。
  4. DATA 
    这个命令没有参数,告诉服务器接着要发送邮件内容。
    邮件内容包含邮件标题项(message header section )和邮件正文(message body),
    标题项(Header Fields )是以项目名(field name)为行的起点,接着是冒号(":"),跟着是内容(field body)以回车换行结束(CRLF),下面是标题项的例子
    1. From: [email protected] 
    2. To: [email protected]
    3. Cc: [email protected] 
    4. subject: subject 
    其中From、To、Cc、subject就是项目名,冒号后是内容。邮件的标题区与正文区需要用一个空行隔开。两者共同组成DATA命令的参数,正文区用只有一个点字符“.”的单行来结束。
  5. SEND 
    初始化邮件事务,邮件数据被转发到一个或多个终端。
  6. SOMLSEND OR MAIL)
    初始化邮件事务,邮件数据被转发到一个或多个终端或邮箱。
  7. SAML(SEND AND MAIL)
    初始化邮件事务,邮件数据被转发到一个或多个终端和邮箱。
  8. RSET(RESET)
    这个命令用来终止邮件事务(mail transaction),任何已经存储的发送者、接收者、邮件数据(mail data)信息都被丢弃,缓存区被清零。
  9. VRFY(VERIFY) 
    验证邮箱是否存在,如果参数是用户名,则返回一个全名(如果存在)。
  10. EXPN(EXPAND) 
    验证邮箱列表
  11. HELP
    返回帮助信息,带参数时候,返回指定的帮助信息。
  12. NOOP 
    这个命令指示服务器收到命令后不用回复 “OK”
  13. QUIT 
    关闭传输通道。
  14. TURN 
    交换邮件发送者和接收者的角色,这个命令用在建立连接成本高的时候,TCP连接不用这个命令。这个命令会产生安全问题,只有在服务器可以被授权作为客户端时候才能用。

6.  新标准rfc5321弃用的命令

SMTP协议详解_第2张图片


这里是c++发邮件类(含附件带注释)
https://blog.csdn.net/sinat_36219858/article/details/80439782
这个是便于理解的函数式编程c++发邮件程序
https://blog.csdn.net/sinat_36219858/article/details/71074776


参考:http://www.cnblogs.com/sdgwc/p/3324368.html



你可能感兴趣的:(SMTP)