SMTP協(xié)議研究

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í)間须揣、正文等。

20170403164927322

其中信封的部分就是通過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

上面的 MAILRCPT 兩個(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ū)都被清零捌浩。
MAIL 這個(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í)候很像。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末警医,一起剝皮案震驚了整個(gè)濱河市亿胸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌预皇,老刑警劉巖侈玄,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吟温,居然都是意外死亡拗馒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門溯街,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诱桂,“玉大人,你說我怎么就攤上這事呈昔』拥龋” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵堤尾,是天一觀的道長(zhǎng)肝劲。 經(jīng)常有香客問我,道長(zhǎng)郭宝,這世上最難降的妖魔是什么辞槐? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮粘室,結(jié)果婚禮上榄檬,老公的妹妹穿的比我還像新娘。我一直安慰自己衔统,他們只是感情好鹿榜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锦爵,像睡著了一般舱殿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上险掀,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天沪袭,我揣著相機(jī)與錄音,去河邊找鬼樟氢。 笑死冈绊,一個(gè)胖子當(dāng)著我的面吹牛创倔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播焚碌,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼畦攘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了十电?” 一聲冷哼從身側(cè)響起知押,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹃骂,沒想到半個(gè)月后台盯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畏线,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年静盅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寝殴。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒿叠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚣常,到底是詐尸還是另有隱情市咽,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布抵蚊,位于F島的核電站施绎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贞绳。R本人自食惡果不足惜谷醉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冈闭。 院中可真熱鬧俱尼,春花似錦、人聲如沸拒秘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躺酒。三九已至,卻和暖如春蔑歌,著一層夾襖步出監(jiān)牢的瞬間羹应,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工次屠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留园匹,地道東北人雳刺。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像裸违,于是被迫代替她去往敵國和親掖桦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容