簡單郵件傳輸協定(SMTP)
/ ess-em-tee-PEE /
電子郵件從你的寄件匣抵達別人的收件匣,是經過一連串郵件伺服器接力傳遞的,而它們用來沿著這條鏈把訊息交下去的協定,就是 SMTP。可以把它想成電子郵件的郵務卡車與分檢中心:SMTP 是用來把一則訊息從寄件者推向目的地的。它專管投遞——把信送到正確的大樓——而不管你打開信箱去讀收到了什麼(那是 IMAP 或 POP3 的工作)。
一次 SMTP 交換是一段簡短、可讀、一行接一行的對話。傳送方連上接收伺服器(伺服器之間走 TCP port 25,從你自己的程式提交郵件時走 587),然後雙方輪流:用戶端報上自己(「HELO」)、聲明寄件者(「MAIL FROM:」)、聲明收件者(「RCPT TO:」),接著說「DATA」並送出訊息的標頭與主體,最後以僅含一個句點的一行作結。伺服器對每個命令都回一個數字狀態(250 代表 OK)。因為郵件可能經過數個中繼,訊息會累積一行行的「Received:」標頭,每經一站一行,記下它的旅程——這就是為什麼你有時能追溯一則訊息真正的來處。
SMTP 是推送(push)協定:寄件者的伺服器主動把訊息推向收件者。有兩個誠實的提醒很重要。第一,原始的 SMTP 只承載 7 位元的 ASCII 文字,所以附件、圖片與非英文字元,都由 MIME 編碼成 ASCII,搭在 SMTP 主體裡傳送。第二,傳統 SMTP 沒有內建驗證寄件者究竟是誰的機制——「MAIL FROM」位址可以直接造假,這正是垃圾郵件與偽造「寄件人」位址如此容易的根本原因,也是後來要外加機制(SPF、DKIM、DMARC)來檢查某伺服器是否真有權代某網域寄信的緣由。
要寄一張便箋給「[email protected]」,你的伺服器開一條到 b.com 郵件伺服器的連線並開口:「MAIL FROM:<[email protected]>」——伺服器:「250 OK」;「RCPT TO:<[email protected]>」——「250 OK」;「DATA」——「354 請繼續」;接著是標頭、主體,與單獨一行的「.」——「250 訊息已接受」。這張便箋現在落入 b.com 手中了。
SMTP 是一行接一行的推送:先信封(MAIL FROM/RCPT TO)再 DATA,每一步都以一個碼確認。
SMTP 只負責把郵件投遞到收件者的伺服器;它不能讓你讀自己的信箱——那是 IMAP 與 POP3 的事。而 SMTP 的「From」極易偽造,這正是上層要有反偽冒機制的原因。