013 Rust 網路程式設計,SMTP 介紹

linghuyichong發表於2020-05-11

SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議)是用來傳輸電子郵件的協議,主要用於系統之間的郵件資訊傳遞,並提供有關來信的通知。使用SMTP,可實現相同網路處理程式之間的郵件傳輸,也可透過中繼器或閘道器實現某處理程式與其它網路之間的郵件傳輸。

  • SMTP工作在兩種情況下,一種是電子郵件從客戶機傳輸到伺服器,另外一種是從某個伺服器傳輸到另外一個伺服器(即中繼)。
  • SMTP是請求/響應協議,命令和響應都是基於ASCII文字,並且以CR和LF符結尾,響應包括一個表示返回狀態的三位數字程式碼。
  • SMTP是基於TCP協議的,並且在25號埠監聽連結請求。

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. 客戶端傳送“RCPTTO”命令向服務端告知收信人的郵箱與域名;
4. 服務端向客戶端響應“250”;
5. 客戶端傳送“DTAT”命令進行報文傳送初始化;
6. 服務端響應“354”,表示可以進行郵件輸入了;
7. 客戶端傳送報文內容,每行以CRLF終止,報文以只有一個“.”的行終止;
8. 服務端向客戶端響應“250”。
  • 連線釋放:
1. SMTP客戶端傳送“QUIT”命令;
2. 服務端響應“221”;
3. 關閉TCP連線。
本作品採用《CC 協議》,轉載必須註明作者和本文連結
令狐一衝

相關文章