SMTP( Simple Mail Transfer Protocol, 簡單郵件傳輸協議 )
一封郵件是由信封和內容構成
-
信封
包含發送者地址、傳輸模式、一個或多個接收者地址 -
內容
使用頭部和主體組成- 頭部的結構是鍵/值對的集合,並且必須是使用US ASCII進行編碼
- 主體是文本結構,通常使用US ASCII編碼,但一些擴展(比如MIME)放開了這種限制
連接網易SMTP服務器
> nc smtp.163.com 25
< 220 163.com Anti-spam GT for Coremail System (163com[20141201])
EHLO命令
當開啓一個SMTP會話時,第一個命令是EHLO
或者HELO
當客戶端支持擴展SMTP協議,則應該發送EHLO
命令
服務器接收到EHLO
命令:如果命令不被允許,則返回狀態碼501;如果沒有實現該命令,則返回狀態碼502
可以理解爲擴展SMTP協議使用EHLO
命令來替代傳統SMTP協議中的HELO
命令
語法:EHLO <SP> <domain> <CRLF>
sp
表示空格,CRLF
表示回車換行,參數domain
表示郵件發送者(指用戶名或者主機名)
> EHLO myself
< 250-mail
< 250-PIPELINING
< 250-AUTH LOGIN PLAIN
< 250-AUTH=LOGIN PLAIN
< 250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrhOTc3UCa0xDrUUUUj
< 250-STARTTLS
< 250 8BITMIME
返回的內容與服務器提供的SMTP擴展服務有關,不同的服務器返回內容一般不同
AUTH命令
在EHLO
命令中,服務器會返回所支持的認證方式,就本例而言,該SMTP服務器支持LOGIN
和PLAIN
兩種方式,當然,SMTP驗證還有GSSAPI
、CRAM-MD5
等
使用LOGIN
方式登陸,用戶名和密碼使用Base64加密加密
> AUTH LOGIN
< 334 dXNlcm5hbWU6
> base64(my name)
< 334 UGFzc3dvcmQ6
> base64(my password)
> 235 Authentication successful
MAIL FROM命令
語法:MAIL <SP> FROM:<reverse-path> <CRLF>
參數reverse-path
表示反向路徑,其中包含發送過程中經過的主機名列表以及郵箱名,列表中第一個主機就是發送此命令的主機,可用於接收錯誤信息。當然在使用過程中,我們簡單的設爲自己的郵箱名就好
此命令告訴服務器新的發送操作已經開始,服務器會復位所有狀態表和緩衝區(包括接收人和郵件數據)
> MAIL FROM:<[email protected]>
< 250 Mail OK
RCPT TO命令
語法:RCPT <SP> TO:<forward-path> <CRLF>
參數forward-path
包含主機的路由表和目的郵箱,在其中的第一個主機就是接收命令的主機。作爲用戶簡單的設置接收者的郵箱地址就可以
可以設置多個接收者
> RCPT TO:<[email protected]>
< 250 Mail OK
> RCPT TO:<[email protected]>
< 550 User not found
如果命令被接收,服務器返回一個250 OK應答。如果接收者未知,接收方會返回一個550 Failure應答
DATA命令
語法:DATA <CRLF>
如果命令被接收,服務器返回一個354 Intermediate應答。這時寫完信件內容,在最後一行僅發送一個句號來表示郵件內容的結束(接受者不會收到該句號),當信件結尾收到並存儲後,接收者發送一個250 OK應答。
信件內容的頭部應該包含Date(時間), Subject(標題), To(收件人), Cc(抄送), From(發件人)這些基本信息
> DATA
< 354 End data with <CR><LF>.<CR><LF>
> from:<[email protected]>
> to:<[email protected]>
> subject:hello world
>
> hello,this is a mail
> .
< 250 Mail OK queued as smtp4,DtGowAC3N2HNfaRc+oFDAA--.262S2 1554284072
上述的命令需要按順序執行,郵件才能發送成功,可以到自己的郵箱中查看,如果沒有找到,或許被放入了垃圾箱裏
服務器應答狀態碼
- 220 服務器服務就緒
- 250 命令操作完成
- 334 等待客戶端輸入