SMTP/POP3/IMAP 命令簡介

 SMTP 命令簡介

什麼是 SMTP
SMTP (Simple Mail Transfer Protocol) : 電子郵件從客戶機傳輸到服務器或從某一個服務器傳輸到另一個服務器使用的傳輸協議。 SMTP 是請求/響應協議,命令和響應都是基於 ASCII 文本,並以 CR 和 LF 符結束。響應包括一個表示返回狀態的三位數字代碼。SMTP 在 TCP 協議 25 端口監聽連接請求。

什麼是 ESMTP
ESMTP (Extended SMTP),顧名思義,擴展 SMTP 就是對標準 SMTP 協議進行的擴展。它與 SMTP 服務的區別僅僅是,使用 SMTP 發信不需要驗證用戶帳戶,而用 ESMTP 發信時,服務器會要求用戶提供用戶名和密碼以便驗證身份。驗證之後的郵件發送過程與 SMTP 方式沒有兩樣。

SMTP 命令
SMTP 命令包括:
HELO 向服務器標識用戶身份。
EHLO 向服務器標識用戶身份。說明是通過認證發信.
MAIL FROM 命令中指定的地址是發件人地址
RCPT TO 標識單個的郵件接收人;可有多個 RCPT TO;常在 MAIL 命令後面。
DATA 在單個或多個 RCPT 命令後,表示所有的郵件接收人已標識,並初始化數據傳輸,以 CRLF.CRLF 結束
VRFY 用於驗證指定的用戶/郵箱是否存在;由於安全方面的原因,服務器常禁止此命令
EXPN 驗證給定的郵箱列表是否存在,擴充郵箱列表,也常被禁用
HELP 查詢服務器支持什麼命令
NOOP 無操作,服務器應響應 OK
RSET 重置會話,當前傳輸被取消
QUIT 結束會話

連接到 Postfix 使用 SMTP 命令發送郵件
例如:安裝 Postfix 的郵件服務器IP是mail.test.com (藍色字體內容由客戶端輸入,紅色字體內容是服務返回的)

telnet mail.test.com --------------------------------------- 使用 telnet 命令連接服務器 25 端口
Trying mail.test.com... --------------------------------------- 正在連接服務器 25 端口
Connected to mail.test.com. ----------------------------------- 連接服務器 25 端口成功
220 localhost ESMTP Postfix - by mail.test.com -------------------- 顯示服務器標識 ( 修改main.cf 的smtpd_banner)
helo test.com ----------------------------------------------- 向服務器標識用戶身份,發信不要認證,跳過下面幾步直接發送 mail from 命令
250 localhost
ehlo test.com ------------------------------------------------ ESMTP 命令,發信需要認證。
250-localhost
250-PIPELINING
250-SIZE 102400000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login ------------------------------------------------- 進行用戶身份認證
334 VXNlcm5hbWU6
Y29zdGFAYW1heGl0Lm5ldA== ----------------------------------- BASE64 加密後的用戶名
334 UGFzc3dvcmQ6
MTk4MjIxNA== ----------------------------------------------- BASE64 加密後的密碼
235 authentication successfully ---------------------------- 身份認證成功
(535 authentication failed --------------------------------- 身份認證失敗)
發到本系統中域名下的賬戶可跳過身份認證。
mail from: <[email protected]> ------------------------------ mail from 地址 [email protected]
250 ok ----------------------------------------------------- 命令執行成功
rcpt to: <[email protected]> -------------------------------- 遞送給地址 [email protected]
250 ok ----------------------------------------------------- 命令執行成功
data ------------------------------------------------------- 數據傳輸初始化
354 End data with .----------------------------------------- 開始傳輸數據
From: [email protected]
To: [email protected]
Date: Mon, 25 Oct 2004 14:24:27 +0800
Subject: test mail

Hi, test2
This is a test mail, you don't reply it.

.
------------------------------------------------------------ 數據內容,包括BASE64加密後的郵件內容, 以 CRLF.CRLF 結束數據傳輸
250 OK: queued as 2F6DE3929--------------------------------- 命令執行成功
quit ------------------------------------------------------- 結束會話
221 Bye
Connection closed by foreign host .------------------------- 斷開連接

POP3命令簡介
什麼是 POP3
POP3 (Post Office Protocol 3) 即郵局協議的第 3 個版本,它規定怎樣將個人計算機連接到 Internet 的郵件服務器和下載電子郵件的電子協議。它是因特網電子郵件的        
第一個離線協議標準, POP3 允許用戶從服務器上把郵件存儲到本地主機(即自己的計算機)上,同時刪除保存在郵件服務器上的郵件,而POP3服務器則是遵循 POP3 協議的接收郵件服務器,用來接收電子郵件的。

POP3 命令
POP3 命令包括:
USER username 認證用戶名        
PASS password 認證密碼認證,認證通過則狀態轉換        
APOP name,digest 認可一種安全傳輸口令的辦法,執行成功導致狀態轉換,請參見 RFC 1321 。        
STAT 處理請求 server 回送郵箱統計資料,如郵件數、 郵件總字節數        
UIDL n 處理 server 返回用於該指定郵件的唯一標識, 如果沒有指定,返回所有的。        
LIST n 處理 server 返回指定郵件的大小等        
RETR n 處理 server 返回郵件的全部文本        
DELE n 處理 server 標記刪除,QUIT 命令執行時才真正刪除        
RSET 處理撤消所有的 DELE 命令        
TOP n,m 處理 返回 n 號郵件的前 m 行內容,m 必須是自然數        
NOOP 處理 server 返回一個肯定的響應        
QUIT 希望結束會話。如果 server 處於"處理" 狀態,則現在進入"更新"狀態,刪除那些標記成刪除的郵件。如果 server 處於"認可"狀態,則結束會話時 server 不進入"更新"狀態 。

使用 telnet 連接 Winmail Server 收信
例如:安裝 Winmail 的郵件服務器 IP 是 mail.test.com(藍色字體內容由客戶端輸入,紅色字體內容是服務返回的)
  telnet mail.test.com 110 ----------------------------- 使用 telnet 命令連接服務器 110 端口      
  Trying mail.test.com... ------------------------------ 正在連接服務器 110 端口      
  Connected to mail.test.com. -------------------------- 連接服務器 110 端口成功      
  +OK Winmail Mail Server POP3 ready        
  user username ------------------------------------------ 輸入用戶名, username 爲具體的用戶名      
  +OK ---------------------------------------------------- 執行命令成功
  pass password ------------------------------------------ 輸入用戶密碼,password 爲具體的密碼,這裏要注意,當密碼輸入錯誤後要重新user username後再運行此命令,否則提示命令無效      
  +OK 2 messages ----------------------------------------- 密碼認證通過
  (-ERR authorization failed ----------------------------- 密碼認證失敗)      
  stat --------------------------------------------------- 郵箱狀態
  +OK 2 6415 --------------------------------------------- 2 爲該信箱總郵件數,6415 爲總字節數      
  list --------------------------------------------------- 列出每封郵件的字節數
  +OK ---------------------------------------------------- 執行命令成功,開始顯示,左邊爲郵件的序號,右邊爲該郵件的大小
  1 537 -------------------------------------------------- 第 1 封郵件,大小爲 537 字節      
  2 5878 ------------------------------------------------- 第 2 封郵件,大小爲 5878 字節      
  .
  top 1 -------------------------------------------------- 接收第 1 封郵件
  +OK ---------------------------------------------------- 接收成功, 返回第 1 封郵件頭
  Return-Path: <[email protected]>
  Delivered-To: [email protected]
  Received: (winmail server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800
  From: [email protected]
  To: [email protected]
  Date: Mon, 25 Oct 2004 14:24:27 +0800
  Subject: test mail
  .    
  retr 1 ------------------------------------------------- 接收第 1 封郵件    
  +OK ---------------------------------------------------- 接收成功, 返回第 1 封郵件全部內容
  Return-Path: <[email protected]>
  Delivered-To: [email protected]
  Received: (winmail server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800
 
From: [email protected]
  To: [email protected]
  Date: Mon, 25 Oct 2004 14:24:27 +0800
  Subject: test mail
 
  Hi, test2
  This is a test mail, you don't reply it.
 
  .
 
  dele 1 ------------------------------------------------- 刪除第 1 封郵件  
  +OK ---------------------------------------------------- 刪除成功    
  dele 2 ------------------------------------------------- 刪除第 2 封郵件  
  +OK ---------------------------------------------------- 刪除成功    
  quit --------------------------------------------------- 結束會話
  +OK ---------------------------------------------------- 執行命令成功

IMAP命令概要
IMAP協議中的命令與POP3中最大的不同是每條命令前都一有一個由Client指定的標籤,同一個會話中,Client發出的每條命令都會有不同的標籤;而Server對每個Client發出的命令都必須以相同的標籤作應答。這就使得IMAP會話中Client可以同時送出多個命令,而Server則完全可以併發處理這些命令,不必等待上一個命令執行完畢才處理下一個。
下面是若干常用的IMAP命令
<TAG> LOGIN <user name> <password>
LOGIN命令用於登錄IMAP服務器,與POP3顯著不同的是用戶名和口令同時作爲參數提交給Server,而POP3完成同樣的操作需要USER和PASS兩條命令。
C: a001 LOGIN SMITH SESAME
S: a001 OK LOGIN completed
<TAG> CREATE <folder>
CREATE可以創建指定名字的文件夾。文件夾名字通常是帶路徑的文件夾全名。
C: A003 CREATE owatagusiam/
S: A003 OK CREATE completed
C: A004 CREATE owatagusiam/blurdybloop
S: A004 OK CREATE completed
<TAG> DELETE <folder>
DELETE命令刪除指定名字的文件夾。文件夾名字通常是帶路徑的文件夾全名。
C: A683 DELETE blurdybloop
S: A683 OK DELETE completed
C: A684 DELETE foo
S: A684 NO Name "foo" has inferior hierarchical names
C: A685 DELETE foo/bar
S: A685 OK DELETE Completed
<TAG> RENAME <old folder> <new folder>
RENAME命令可以修改文件夾的名稱。
C: A683 RENAME blurdybloop sarasoop
S: A683 OK RENAME completed
C: A684 RENAME foo zowie
S: A684 OK RENAME Completed
<TAG> LIST <BASE> <template>
LIST命令用於列出郵箱中已有的文件夾,有點像操作系統的列目錄命令。這個命令可以包含起始的路徑位置和需要列出的文件夾所符合的特徵,可以使用通配符"*"。
C: A101 LIST "" ""
S: * LIST (\Noselect) "/" ""
S: A101 OK LIST Completed
C: A102 LIST #news.comp.mail.misc ""
S: * LIST (\Noselect) "." #news.
S: A102 OK LIST Completed
C: A103 LIST /usr/staff/jones ""
S: * LIST (\Noselect) "/" /
S: A103 OK LIST Completed
C: A202 LIST ~/Mail/ %
S: * LIST (\Noselect) "/" ~/Mail/foo
S: * LIST () "/" ~/Mail/meetings
S: A202 OK LIST completed
<TAG> APPEND <folder> <attributes> <size> <mail data>
APPEND命令允許Client上載一個郵件到指定的Folder中。命令中包含了新郵件的屬性、大小,隨後是郵件數據。
C: A003 APPEND saved-messages (\Seen) {310}
C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)
C: From: Fred Foobar <[email protected]>
C: Subject: afternoon meeting
C: To: [email protected]
C: Message-Id: <[email protected]>
C: MIME-Version: 1.0
C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
C:
C: Hello Joe, do you think we can meet at 3:30 tomorrow?
C:
S: A003 OK APPEND completed
<TAG> SELECT <folder>
SELECT命令讓Client選定某個Folder,表示即將對該Folder內的郵件作操作。
C: A142 SELECT INBOX
S: * 172 EXISTS
S: * 1 RECENT
S: * OK [UNSEEN 12] Message 12 is first unseen
S: * OK [UIDVALIDITY 3857529045] UIDs valid
S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited
S: A142 OK [READ-WRITE] SELECT completed
<TAG> FETCH …
FETCH命令是IMAP協議裏最複雜的命令。FETCH的命令參數很多、很複雜,難以一一列舉,但基本的特徵是允許將郵件按照MIME結構拆解爲零碎的部件來提取。例如,可以利用FETCH命令提取郵件頭、某一個附件、或某一郵件附件頭部的某一字段,等等。
<TAG> STORE <mail id> <new attributes>
STORE命令用於修改指定郵件的屬性,包括給郵件打上已讀標記、刪除標記,等等。
C: A003 STORE 2:4 +FLAGS (\Deleted)
S: * 2 FETCH FLAGS (\Deleted \Seen)
S: * 3 FETCH FLAGS (\Deleted)
S: * 4 FETCH FLAGS (\Deleted \Flagged \Seen)
S: A003 OK STORE completed
<TAG> CLOSE
CLOSE命令表示Client結束對當前Folder的訪問,隨後可以SELECT另一Folder。
C: A341 CLOSE
S: A341 OK CLOSE completed
<TAG> EXPUNGE
EXPUNGE將郵箱中所有打了刪除標記的郵件徹底刪除。EXPUNGE刪除的郵件將不可以恢復。
C: A202 EXPUNGE
S: * 3 EXPUNGE
S: * 3 EXPUNGE
S: * 5 EXPUNGE
S: * 8 EXPUNGE
S: A202 OK EXPUNGE completed
<TAG> LOGOUT
LOGOUT命令結束本次IMAP會話。
C: A023 LOGOUT
S: * BYE IMAP4rev1 Server logging out
S: A023 OK LOGOUT completed
(Server and client then close the connection)

簡單例子:
1 LOGIN [email protected] 123456
2 LIST "" ""
3 LIST "" "*"
4 SELECT INBOX.Sent
5 FETCH 0 body[header]
6 LOGOUT
telnet [email protected] 143
A LOGIN username password
A SELECT INBOX
A UID SEARCH ALL
A UID FETCH 0:100 FLAGS
A LIST "" "*"
A COPY 2 INBOX.Trash
A STORE 2 FLAGS (\Seen)
A UID STORE 16:17 +FLAGS.SILENT (\Flagged)
A FETCH 1 body[header]
A FETCH 1 body[text][/code]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章