美文网首页RUST编程
013 Rust 网络编程,SMTP 介绍

013 Rust 网络编程,SMTP 介绍

作者: 令狐壹冲 | 来源:发表于2020-05-13 21:37 被阅读0次

    概念

    SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是用来传输电子邮件的协议,主要用于系统之间的邮件信息传递,并提供有关来信的通知。使用SMTP,可实现相同网络处理进程之间的邮件传输,也可通过中继器或网关实现某处理进程与其它网络之间的邮件传输。

    • SMTP工作在两种情况下,一种是电子邮件从客户机传输到服务器,另外一种是从某个服务器传输到另外一个服务器(即中继)。
    • SMTP是请求/响应协议,命令和响应都是基于ASCII文本,并且以CR和LF符结尾,响应包括一个表示返回状态的三位数字代码。
    • SMTP是基于TCP协议的,并且在25号端口监听链接请求。

    SMTP命令

    SMTP是请求/响应协议,主要是在客户端和服务端(逻辑上)之间进行请求和应答,因此就涉及到响应的命令和应答码。

    |--------|                         |--------|
    |        | --------Request-------> |        |
    | client |                         | server |  
    |        | <-------Response------- |        |
    |--------|                         |--------|
    

    SMTP基本命令集:

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

    SMTP 应答码:

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

    邮件封装

    SMTP将传输的内容封装在邮件对象中,邮件对象主要包括信封和内容两部分。

    示例:

       |--------------------------------|   
       | MAIL FROM: xiaoming@163.com    |   信封
       | RCPT TO  : 12345678@qq.com     |
       |--------------------------------| 
       | From:xiaoming                 |
       | To:  xiaohong                 |   头部
       | Date:2020/5/10                |
       | Subject: test                  |
       |--------------------------------| 
       | Dear xiaohong:                 |
       |     I miss you very much.      |   内容
       |    ...                         |
       |--------------------------------| 
    

    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:内容描述
    

    工作过程

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

    • 建立连接:
    1. 客户端通过25端口与服务端建立TCP连接,服务端返回应答码220,并提供服务端的域名;
    2. 客户端收到应答码,发送HELO命令,启动SMTP会话,通过HELo命令,客户端向服务端提供标识信息;
    3. 服务端响应应答码250,通知客户端建立会话成功。
    
    • 邮件传送:
    1. 客户端发送“MAIL; FROM”通知服务端发信人的邮箱与域名;
    2. 服务端向客户端响应“250”;
    3. 客户端发送“RCPT; TO”命令向服务端告知收信人的邮箱与域名;
    4. 服务端向客户端响应“250”;
    5. 客户端发送“DTAT”命令进行报文传送初始化;
    6. 服务端响应“354”,表示可以进行邮件输入了;
    7. 客户端发送报文内容,每行以CR与LF终止,报文以只有一个“.”的行终止;
    8. 服务端向客户端响应“250”。
    
    • 连接释放:
    1. SMTP客户端发送“QUIT”命令;
    2. 服务端响应“221”;
    3. 关闭TCP连接。
    

    相关文章

      网友评论

        本文标题:013 Rust 网络编程,SMTP 介绍

        本文链接:https://www.haomeiwen.com/subject/zyxanhtx.html