TCP/IP 與 Internet 網路:第十四章 電子郵件系統 上一頁 下一頁
14-4 SMTP 協定
早期製作『簡易郵件傳輸協定』(Simple Mail Transfer Protocol, SMTP)的目的是希望提供一個簡單的共通郵件傳輸方法,讓不同系統之間的郵件可以互相轉送。因此,SMTP 協定也是採用 NVT ASCII 傳輸方式(第十二章介紹),並且有提供直譯程式,使用者可以透過連接埠口(25/tcp)來發送與接收郵件。雖然早期 SMTP 協定是由 RFC 821 與 822 制定標準,但隨著 E-mail 系統的高度需求,傳輸規範也不斷更新,以下列出較重要的 RFC 規範:
▲ RFC 821:Simple Mail Transfer Protocol 。
▲RFC 822:Standard for the format of ARPA Internet text messages 。
▲ RFC 1425:SMTP Service Extensions 。
▲ RFC 1426:SMTP Service Extension for 8bit-MIME Transport 。
▲ RFC 1427:SMTP Service Extension for Message Size Declaration 。
▲ RFC 1651:SMTP Service Extensions 。
▲ RFC 1652:SMTP Service Extension for 8bit-MIMEtransport 。
▲ RFC 1653:SMTP Service Extension for Message Size Declaration 。
▲ RFC 1869:SMTP Service Extensions 。
▲ RFC 2554:SMTP Service Extension for Authentication 。
▲ RFC 2821:Simple Mail Transfer Protocol
▲ RFC 3030:SMTP Service Extensions for Transmission of Large and Binary MIME Messages 。
▲ RFC 3207:SMTP Service Extension for Secure SMTP over Transport Layer Security 。
圖 14-5 為 SMTP 協定的功能圖,客戶端(Linux 或 Win 98)透過 SMTP 協定將信件傳送給郵件交換伺服器(或稱 SMTP Server),由 SMTP Server 負責傳送信件。也許該信件會經過多個 SMTP Server 之間的轉送,才會到達目的主機(郵件伺服器),但它們之間都以 SMTP 協定來通訊。
圖 14-5 SMTP 協定功能
14-4-1 SMTP 命令
既然 SMTP 協定是以 NVT ASCII 方式實現,我們可以用 Telnet 方式登入該傳輸埠口,並利用 SMTP 命令來從事郵件傳輸的工作。SMTP 是架設在 TCP 協定上,而著名傳輸埠口是 25(tcp/25),因此,我們登入 linux-2(如圖 9-1)的 SMTP 埠口如下:(並執行 help 命令)
[root@linux-2 root]# telnet 163.15.2.30 25 Trying 163.15.2.30... Connected to linux-2.cu.edu.tw (163.15.2.30). Escape character is '^]'. 220 linux-2.cu.edu.tw ESMTP Sendmail 8.11.6/8.11.6; Mon, 5 Aug 2002 09:34:28 +08 00 help 214-2.0.0 This is sendmail version 8.11.6 214-2.0.0 Topics: 214-2.0.0 HELO EHLO MAIL RCPT DATA 214-2.0.0 RSET NOOP QUIT HELP VRFY 214-2.0.0 EXPN VERB ETRN DSN AUTH 214-2.0.0 STARTTLS 214-2.0.0 For more info use "HELP <topic>". 214-2.0.0 To report bugs in the implementation send email to 214-2.0.0 sendmail-bugs@sendmail.org. 214-2.0.0 For local information send email to Postmaster at your site. 214 2.0.0 End of HELP info |
上述範例中,也執行 help 命令來查詢 SMTP 協定(sendmail)所提供的命令,我們以發信一封信件給 tsnien@linux-2.cu.edu.tw 為例子,來說明這些命令的功能:
● HELO:開啟通訊連線的命令,以下範例表示由 win98-1 主機向 SMTP 伺服器要求連線,並表示連線成功(回覆訊息 250)。(延續上一範例)
helo win98-1.cu.edu.tw 250 linux-2.cu.edu.tw Hello linux-2.cu.edu.tw [163.15.2.30] |
上述中有兩個 linux-2 主機位址,後面的是 DNS 伺服器位址,表示主機向 DNS 伺服器查詢 win98-1 位址正常(同意服務)。
● MAIL:經過 HELO 連線成功後,便可開始以 MAIL 命令來傳送信件。而此 mail 命令表示開啟傳送信件,並告知傳送信件者(FROM:)
mail from:tsnien@linux-1.cu.edu.tw 250 2.1.0 tsnien@linux-1.cu.edu.tw... Sender ok |
● RCPT:接下來,以 RCPT 告訴系統收信者(Recipient)位址,命令格式如下:
rcpt to:tsnien@linux-2.cu.edu.tw 250 2.1.5 tsnien@linux-2.cu.edu.tw... Recipient ok |
● DATA:告知系統發信者(MAIL FROM:)和收信者(RCTP TO:)後,便可以 DATA 來發信了,寫完信後以『.』來表示信件結束,而系統就會將該信件發送,並回應結果,如下範例:
data 354 Enter mail, end with "." on a line by itself good lucky to you . 250 2.0.0 g752Uks02558 Message accepted for delivery |
● QUIT:送完信件後,便可以 QUIT 命令來結束連線,範例如下:
quit 221 2.0.0 linux-2.cu.edu.tw closing connection Connection closed by foreign host. |
以上命令是針對傳遞信件使用,但還有一些常用命令如下:
▼ RESET:此命令可中斷目前郵件紀錄,並使雙方重新設定。執行 RESET 命令後,會捨棄雙方所有儲存的資訊。
▼ VRFY:(Verify)此命令讓發信端要求驗證收信人的位址是否正確,而不需傳送信件給收信人。通常是由系統管理者想要刪除有問題的郵件時,來確認該信件的傳送位址是否有問題。
▼ NOOP:(No Operation)此命令不作任何處理,強迫系統回應『OK』,以確定系統是否工作正常。
▼ EXPN:(Expand)此命令作為展開『郵遞清單』(Mailing List)使用。
14-4-2 SMTP 回覆訊息
SMTP 也如同 Telnet 協定一樣,客戶端和伺服端之間都是採用交談式模式,是以『命令/回覆』機制來進行溝通,也是由客戶端為主動,送出一個命令後,等待伺服端回覆執行的結果。SMTP 伺服器回覆『回應碼』給客戶端,客戶端再以回應碼來判斷所下命令的執行結果。SMTP 的回應碼如表 14-1 所示。(回應顯示請參考上一小節範例樣式)
表 14-1 SMTP 回應碼
回應碼 |
回 應 訊 息 |
211 |
回覆系統狀態。 |
214 |
回覆求助訊息。 |
220 |
SMTP 伺服器開始提供服務。 |
221 |
SMTP 伺服器關閉連線通道。 |
250 |
命令執行完畢,回應正確。 |
354 |
請開始輸入郵件內容,並以『.』做文件結束。 |
421 |
SMTP 伺服器無法提供服務,將會關閉連線通道。 |
450 |
指定的郵件伺服器無法提供服務,郵件無法傳送到達。 |
451 |
執行 SMTP 命令錯誤,被迫中斷連線。 |
452 |
因系統儲存空間不足,而無法執行 SMTP 命令。 |
500 |
因SMTP 命令之語法錯誤,而無法執行。 |
501 |
命令的參數或引數的語法有誤。 |
502 |
不支援此命令。 |
503 |
命令序列有誤, |
504 |
不支援此命令參數。 |
550 |
指定的郵件伺服器有誤(找不到),而無法執行。 |
551 |
指定的郵件伺服器無該使用者,請令指定使用者名稱。 |
552 |
因超出配額空間,而無法傳送郵件。 |
553 |
因指定郵件信箱有誤,而無法傳送信件。 |
554 |
處理失敗。 |
14-4-3 SMTP 郵件格式
在 RFC 822 中規範電子郵件由三個部分所組成:信封(Envelope)、標頭(Headers)和主體(Body),以下分別介紹之:
(A)信封
信封(Envelope)就如一般我們在郵局傳遞信件的信封一樣,信封上必須標明收信者和發信者的名稱地址。E-mail 的信封是由兩個命令來達成:
MAIL From: tsnien@linux-2.cu.edu.tw (發信者名稱和地址)
RCPT To: tsnien@pchome.com.tw (收信者名稱和地址)
有了收信和發信人的地址,此信件就可以依照信封上的註明,在 Internet 網路上通行(轉送與傳遞),有關如何通行的協定請參考 RFC 821 說明。
(B)標頭
E-mail 的封裝格式類似一般公文格式,每一信件(或公文)的標頭(Header)都包含若干個欄位,來說明此信件的來龍去脈,但並非這些欄位都必須填寫。SMTP 協定的信件標頭包含下列欄位:
● To:收件人的 E-mail 位址。
● From:發信人的 E-mail 位址。
● Subject:信件主題。
● Message-ID:此信件的訊息識別碼。
● Date:此信件的發信日期。
● Received:收到此信件時,郵件伺服器的回覆訊息。
● X-Priority:信件的緊急程度『X』。
(C)主體
接下來便是信件的主體(Body),主體也是以 NTV ASCII 方式表示,其中以 『<CR><LF>』表示每行的結束(如十二章介紹),又以『. <CR><LF>』表示文件的結尾。
14-4-4 MIME 郵件格式
如果依照 RFC 822 製作信件格式,那麼 E-mail 僅能傳送文字格式。隨著環境的變遷,僅傳遞文字的信件已不能滿足人們的需求,更希望在文件中也可以傳遞聲音、影像、動畫,成為多媒體的文件格式,因此就有制定『多用途網際網路郵件擴充性』(Multipurpose Internet Mail Extensions, MIME)協定的必要,標準規範為 RFC 1341 與 1521。MIME 主要是增加文件內容的表達方式,和原來 RFC 822 所制定的規範並不相衝突,它增加了五個標頭區域來說明文件格式:
(1) Mime-Version:版本號碼。如 1.0 表示版本 1.0。
(2) Content Type:內容格式。RFC 1521 定義有五種格式:NVT ASCII(7 bits)、Quoted-printable、Base64、8 bits MIME與 Binary。
(3) Content-Transfer-Encoding:文件傳輸編碼方法。
(4) Content-Description:內容描述。
雖然制定了多媒體的傳輸方式,但必須有多媒體的顯示平台,來配合顯示文件內容,如果僅用一般文字模式的終端系統,將無法顯現出多媒體的信件。因此,在 Linux 系統之 X-windows 或 Microsoft 系統上都有各自的郵件處理平台,最普遍使用的是 Outlook 軟體套件。E-mail 客戶端透過 Outlook 可以製作多媒體信件,可以接收及顯示聲音、文字、影像或動畫的多媒體信件。其實各種郵件平台(如 Outlook)製作多媒體文件方式,也是利用『超文字傳輸協定』(HyperText Transfer Protocol, HTTP),文字輸入方式和網頁系統一樣,以 HTML 語言的標記來製作信件,接收端再以各種標記格式將信件顯現出來。有關 MIME 格式命令請參考 RFC 1341 規範,至於 HTML 請參考下一章說明。本書限於篇幅不再贅言。