SMTP (Simple Mail Transfer Protocol) : 電子郵件從客戶機(jī)傳輸?shù)椒?wù)器或從某一個(gè)服務(wù)器傳輸?shù)搅硪粋€(gè)服務(wù)器使用的傳輸協(xié)議。SMTP 是請(qǐng)求/響應(yīng)協(xié)議,命令和響應(yīng)都是基于 ASCII 文本,并以 CR 和 LF 符結(jié)束。響應(yīng)包括一個(gè)表示返回狀態(tài)的三位數(shù)字代碼。SMTP 在 TCP 協(xié)議 25 端口監(jiān)聽連接請(qǐng)求。
ESMTP (Extended SMTP):擴(kuò)展 SMTP 就是對(duì)標(biāo)準(zhǔn) SMTP 協(xié)議進(jìn)行的擴(kuò)展。它與 SMTP 服務(wù)的區(qū)別僅僅是,使用 SMTP 發(fā)信不需要驗(yàn)證用戶帳戶,而用 ESMTP 發(fā)信時(shí),服務(wù)器會(huì)要求用戶提供用戶名和密碼以便驗(yàn)證身份。驗(yàn)證之后的郵件發(fā)送過程與 SMTP 方式?jīng)]有兩樣。
SMTP命令:
HELO 客戶端為標(biāo)識(shí)自己的身份而發(fā)送的命令(通常帶域名)
EHLO 使服務(wù)器可以表明自己支持?jǐn)U展簡(jiǎn)單郵件傳輸協(xié)議 (ESMTP) 命令。
MAIL FROM 標(biāo)識(shí)郵件的發(fā)件人;以 MAIL FROM: 的形式使用。
RCPT TO 標(biāo)識(shí)郵件的收件人;以 RCPT TO: 的形式使用。
TURN 允許客戶端和服務(wù)器交換角色,并在相反的方向發(fā)送郵件,而不必建立新的連接。
ATRN ATRN (Authenticated TURN) 命令可以選擇將一個(gè)或多個(gè)域作為參數(shù)。如果該會(huì)話已通過身份驗(yàn)證,則 ATRN 命令一定會(huì)被拒絕。
SIZE 提供一種使 SMTP 服務(wù)器可以指出所支持的最大郵件大小的機(jī)制。兼容的服務(wù)器必須提供大小范圍,以指出可以接受的最大郵件大小??蛻舳税l(fā)送的郵件不應(yīng)大于服務(wù)器所指出的這一大小。
ETRN SMTP 的擴(kuò)展。SMTP 服務(wù)器可以發(fā)送 ETRN 以請(qǐng)求另一臺(tái)服務(wù)器發(fā)送它所擁有的任何電子郵件。
PIPELINING 提供發(fā)送命令流(而無需在每個(gè)命令之后都等待響應(yīng))的能力。
CHUNKING 替換 DATA 命令的 ESMTP 命令。該命令使 SMTP 主機(jī)不必持續(xù)地掃描數(shù)據(jù)的末尾,它發(fā)送帶參數(shù)的 BDAT 命令,該參數(shù)包含郵件的總字節(jié)數(shù)。接收方服務(wù)器計(jì)算郵件的字節(jié)數(shù),如果郵件大小等于 BDAT 命令發(fā)送的值時(shí),則該服務(wù)器假定它收到了全部的郵件數(shù)據(jù)。
DATA 客戶端發(fā)送的、用于啟動(dòng)郵件內(nèi)容傳輸?shù)拿睢?br>
DSN 啟用傳遞狀態(tài)通知的 ESMTP 命令。
RSET 使整個(gè)郵件的處理無效,并重置緩沖區(qū)。
VRFY 確認(rèn)在郵件傳遞過程中可以使用郵箱;例如,vrfy ted 確認(rèn)在本地服務(wù)器上駐留 Ted 的郵箱。該命令在 Exchange 實(shí)現(xiàn)中默認(rèn)關(guān)閉。
HELP 返回 SMTP 服務(wù)所支持的命令列表。
QUIT 終止會(huì)話。
查看服務(wù)器支持的命令方式:
Example:
>>> import smtplib
>>> s=smtplib.SMTP("localhost")
>>> print(s.help())
This is Sendmail version 8.8.4
Topics:
HELO EHLO MAIL RCPT DATA
RSET NOOP QUIT HELP VRFY
EXPN VERB ETRN DSN
For more info use "HELP <topic>".
To report bugs in the implementation send email to
sendmail-bugs@sendmail.org.
For local information send email to Postmaster at your site.
End of HELP info
>>> s.putcmd("vrfy","someone@here")
>>> s.getreply()
(250, "Somebody OverHere <somebody@here.my.org>")
>>> s.quit()