SMTP簡(jiǎn)介
SMTP稱為簡(jiǎn)單郵件傳輸協(xié)議(Simple Mail Transfer Protocal)登渣,目標(biāo)是向用戶提供高效奴烙、可靠的郵件傳輸炕倘。它的一個(gè)重要特點(diǎn)是它能夠在傳送中接力傳送郵件,即郵件可以通過不同網(wǎng)絡(luò)上的主機(jī)接力式傳送朽褪。通常它工作在兩種情況下:一是郵件從客戶機(jī)傳輸?shù)椒?wù)器躺坟;二是從某一個(gè)服務(wù)器傳輸?shù)搅硪粋€(gè)服務(wù)器菱阵。SMTP是一個(gè)請(qǐng)求/響應(yīng)協(xié)議,它一般監(jiān)聽25號(hào)端口蚊逢,加密協(xié)議一般使用465端口层扶,用于接收用戶的Mail請(qǐng)求,并與遠(yuǎn)端Mail服務(wù)器建立SMTP連接烙荷。
在實(shí)際應(yīng)用中镜会,一般使用SMTP協(xié)議發(fā)送郵件,一般使用POP3,IMAP協(xié)議接收郵件
SMTP協(xié)議工作機(jī)制
SMTP通常有兩種工作模式终抽。發(fā)送SMTP和接收SMTP戳表。具體工作方式為:發(fā)送SMTP在接收到用戶的郵件請(qǐng)求后桶至,判斷此郵件是否為本地郵件,若是本地郵件匾旭,直接投送到用戶的郵箱镣屹,否則向DNS查詢遠(yuǎn)端郵件服務(wù)器的MX記錄,并建立與遠(yuǎn)端接收SMTP之間的一個(gè)雙向傳送通道季率,此后SMTP命令由發(fā)送SMTP發(fā)出野瘦,由接收SMTP接收,而應(yīng)答則反方向傳送飒泻。一旦傳送通道建立鞭光,SMTP發(fā)送者發(fā)送MAIL命令指明郵件發(fā)送者。如果SMTP接收者可以接收郵件則返回OK應(yīng)答泞遗。SMTP發(fā)送者再發(fā)出RCPT命令確認(rèn)郵件是否接收到惰许。如果SMTP接收者接收,則返回OK應(yīng)答史辙;如果不能接收到汹买,則發(fā)出拒絕接收應(yīng)答(但不中止整個(gè)郵件操作),雙方將如此反復(fù)多次聊倔。當(dāng)接收者收到全部郵件后會(huì)接收到特別的序列晦毙,如果接收者成功處理了郵件,則返回OK應(yīng)答耙蔑。
郵箱的發(fā)送流程
先來了解一下郵件的概念
電子郵件和我們生活中發(fā)送的郵件很像见妒,也可以映射為信封、稱謂甸陌、時(shí)間须揣、正文等。
其中信封的部分就是通過SMTP命令指定的钱豁,首部和主體就是寫在郵件正文中的耻卡。
具體怎么來指定這些信息,就要通過SMTP命令了牲尺,具體操作流程如下:
telnet smtp.126.com 25 #與郵箱服務(wù)器簡(jiǎn)歷鏈接
#220 126.com Anti-spam GT for Coremail System (126com[20140526])
EHLO localhost #新協(xié)議中用來替代HELO命令
#250-mail
#250-PIPELINING
#250-AUTH LOGIN PLAIN
#250-AUTH=LOGIN PLAIN
#250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UF9xA92UCa0xDrUUUUj
#250-STARTTLS
#250 8BITMIME
AUTH LOGIN #開始認(rèn)證
#334 dXNlcm5hbWU6
ZXhhbXBsZQ== #base64編碼的用戶名卵酪,example@126.com為例,這里就是base64(example)
#334 UGFzc3dvcmQ6谤碳、
ZXhhbXBsZQ== #base64編碼的密碼
#235 Authentication successful
MAIL FROM:<example@126.com> #指定發(fā)送者溃卡,這個(gè)命令會(huì)重置發(fā)送者、接收者和郵件數(shù)據(jù)
#250 Mail OK
RCPT TO:<example@126.com> #指定接收者估蹄,這個(gè)命令可以執(zhí)行多次塑煎,設(shè)置多個(gè)接收者
#250 Mail OK
DATA #這個(gè)命令沒有參數(shù),指定下面為郵件的正文
#354 End data with <CR><LF>.<CR><LF>
FROM:example@126.com #郵件的正文中也要包含郵件首部信息臭蚁,from,to,cc,subject
TO:example@126.com
CC:example@126.com
SUBJECT:this is SUBJECT
this is body first line #郵件首部信息與郵件主體要用空行分隔
this is second line
. #郵件已單獨(dú)的一個(gè)"."結(jié)束
#250 Mail OK queued as smtp2,DMmowAAnXgAI2wxgIaTcLQ--.8086S2 1611455494
QUIT #斷開連接
#221 Bye
上面的 MAIL
和RCPT
兩個(gè)命令就是在設(shè)置信封最铁,讓服務(wù)器知道郵件是發(fā)給誰的讯赏。
DATA
命令就是在設(shè)置郵件的正文,正文中又包含了首部和主體兩部分的信息
SMTP協(xié)議的主要命令和響應(yīng)
SMTP主要命令
命令 | 含義 |
---|---|
EHLO(Extended hello)/HELO(hello) | 這個(gè)命令用于說明自己是SMTP客戶端身份冷尉,參數(shù)包含客戶端的域名(domain)漱挎。其中EHLO是SMTP補(bǔ)充協(xié)議( RFC 5321 )中用于替換HELO命令的新命令,協(xié)議規(guī)定服務(wù)器支持EHLO命令的時(shí)候雀哨,盡量使用EHLO命令磕谅,為了兼容以前的版本,要求服務(wù)器繼續(xù)支持HELO命令雾棺。如果收到回復(fù)OK膊夹,說明發(fā)送者和接收者處于初始狀態(tài),所有的狀態(tài)表和緩存區(qū)都被清零捌浩。 |
這個(gè)命令的參數(shù)是發(fā)送者郵箱<reverse-path>放刨,參數(shù)中有 FROM 關(guān)鍵字,這個(gè)命令會(huì)清空之前的發(fā)送者郵箱(the reverse-path buffer)尸饺、接收者郵箱(forward-path buffer)和郵件數(shù)據(jù)(the mail data buffer)进统。 | |
RCPT(recipient) | 用于指定一個(gè)郵件接收者,參數(shù)中有TO 關(guān)鍵字浪听,指定多個(gè)接收者通過重復(fù)使用這個(gè)命令螟碎。 |
DATA | 這個(gè)命令沒有參數(shù),告訴服務(wù)器接著要發(fā)送郵件內(nèi)容迹栓。 郵件內(nèi)容包含郵件標(biāo)題項(xiàng)(message header section )和郵件正文(message body)掉分, 標(biāo)題項(xiàng)(Header Fields )是以項(xiàng)目名(field name)為行的起點(diǎn),接著是冒號(hào)(":")迈螟,跟著是內(nèi)容(field body)以回車換行結(jié)束 FROM:example@126.com TO:example@126.com CC:example@126.com SUBJECT:郵件主題 最后正文結(jié)束的地方叉抡,以單獨(dú)的"."為一行尔崔,表示郵件正文結(jié)束 |
QUIT | 關(guān)閉傳輸通道 |
AUTH LOGIN | 登錄認(rèn)證 |
SMTP主要應(yīng)答碼
響應(yīng)碼 | 說明 |
---|---|
220 | 服務(wù)就緒 |
221 | 服務(wù)關(guān)閉傳輸通道 |
250 | 請(qǐng)求指定完成 |
251 | 用戶不是本地用戶答毫,報(bào)文被轉(zhuǎn)發(fā) |
354 | 開始郵件輸入 |
450 | 郵箱不可用 |
500 | 語法錯(cuò)誤,不識(shí)別的命令 |
502 | 命令未實(shí)現(xiàn) |
552 | 所有請(qǐng)求動(dòng)作異常終止 |
553 | 請(qǐng)求的動(dòng)作為發(fā)生季春,郵箱名不允許使用 |
SMTP協(xié)議的擴(kuò)展協(xié)議:MIME
SMTP協(xié)議在傳輸報(bào)文時(shí)洗搂,只能夠傳輸7位的ASCII格式的報(bào)文,不支持那些不使用7位ASCII格式的語種载弄,同時(shí)它也不支持語音和視頻數(shù)據(jù)的傳輸耘拇,因此我們需要一個(gè)輔助性協(xié)議幫忙傳輸報(bào)文,它就是MIME宇攻。
MIME協(xié)議定義了5種頭部惫叛,用來加在原始的STMP頭部,以便定義參數(shù)的轉(zhuǎn)換逞刷。他們分別是:
頭部 | 含義 |
---|---|
MIME-Version | MIME版本 |
Content-Type | 內(nèi)容格式 |
Content-Tansfer-Encoding | 內(nèi)容傳輸編碼 |
Content-ID | 內(nèi)容標(biāo)識(shí) |
Content-Description | 內(nèi)容描述 |
MIME的使用方式
#和之前與服務(wù)器建立連接的方式一致嘉涌,只是在執(zhí)行DATA命令以后妻熊,發(fā)送的郵件正文有所不同,正文的示例如下:
From: <example@126.com>
To: <example@126.com>
Subject:this is subject
Date: Sun, 26 Nov 2006 19:01:04+0800
MIME-Version: 1.0
Content-Type:multipart/alternative;boundary="this_is_boundary"
This is a multi-part message in MIME format.
--this_is_boundary
Content-Type: text/plain;charset="gb2312"
Content-Transfer-Encoding:base64
123123123
--this_is_boundary
Content-Type: text/html;charset="gb2312"
Content-Transfer-Encoding:base64
PEI+MTIzMTIzMTIzPC9CPg==
--this_is_boundary
Content-Type: image/jpeg; name="image005.jpg"
Content-Transfer-Encoding:base64
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
--this_is_boundary--
.
注意在第一個(gè)
Content-Type
中設(shè)置boundary
仑最,后面可以根據(jù)boundary
分隔多個(gè)內(nèi)容部分扔役,每個(gè)分隔符號(hào)為
"--"+boundary
最后一個(gè)結(jié)束的位置為
"--"+boundary+"--"
這個(gè)和html上傳多文件的時(shí)候很像。