您的当前位置:首页正文

013 Rust 网络编程,SMTP 介绍

2024-11-08 来源:个人技术集锦

概念

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连接。
显示全文