一:郵件傳送的基本介紹
在工作中我相信大家會經常和郵件打交道,用郵件來進行資訊的交流和彙報工作情況;但是在我們程式設計師眼裡,郵件的用處還是挺廣泛的,比如我們在註冊賬號完成時平臺會傳送一封郵件給我們,讓我們點選郵件裡的連結來啟用當前註冊的賬號;其實郵件還可以實現驗證碼的傳送、使用者操作提醒、活動通知等功能
1:郵件基本介紹
郵件伺服器:
郵件伺服器是一種用來負責電子郵件收發管理的裝置,同時也是電子郵件系統中的核心內容,
郵件伺服器是有傳送郵件SMTP伺服器和接收郵件POP3伺服器協同工作,並且為使用者提供接收郵件的功能。
郵件伺服器比一般的免費郵箱更加安全,一直被企業公司使用
電子郵箱:
電子郵箱也稱為E-mail地址,比如xx@qq.com、xx@163.com。使用者能通過E-mail地址標識自己傳送的電子郵件,
同時也可以通過這個地址接收別人發來的電子郵件。電子郵箱需要到郵件伺服器進行申請,也就是說,電子郵箱其實就是使用者在郵件
伺服器上申請的賬戶。郵件伺服器會把接收到的郵件儲存到為該賬戶所分配的郵箱空間中,使用者通過使用者名稱密碼登入到郵件伺服器查
收該地址已經收到的郵件。一般來講,郵件伺服器為使用者分配的郵箱空間是有限的。
郵件客戶端:
郵件客戶端就是我們平常在上面進行郵件傳送的網站或者應用,比如常見的FoxMail、雷鳥、outlook、163、mesign等;
通常使用IMAP/APOP/POP3/SMTP協議收發電子郵件的軟體都可以統稱郵件客戶端;因為這些客戶端可以幫助使用者把郵件傳送給SMTP
郵件伺服器,也可以從POP3/IMAP郵件伺服器讀取使用者的電子郵件
郵件傳輸協議:
電子郵件需要在郵件客戶端和郵件伺服器之間,以及兩個郵件伺服器之間進行郵件傳遞,那就必須遵守規則,這個規則就是郵件傳輸協議
SMTP協議(Simple Mail Transfer Protocol)簡單郵件傳輸協議(預設埠25):
它定義了郵件客戶端軟體和SMTP郵件伺服器之間,以及兩臺SMTP郵件伺服器之間的通訊規則
POP/POP3協議:(Post Office Protocol)郵件接收協議(預設埠110):
當使用者計算機與支援POP協議的電子郵件伺服器連線時,把儲存在該伺服器的電子郵箱中的郵件準確無誤地下載到使用者的計算機中。
POP3屬於離線式協議,即不能對郵件進行線上操作,必須下載到本地才能進行處理。POP協議已發展到第三版,稱作POP3。
POP3與SMTP一樣都是請求響應協議,命令與響應也都是用NVT ASCII格式的文字表示。POP3響應由一個狀態碼和其後的附
加資訊組成,只有兩種狀態碼:"+OK"(正確)和"-ERR"(失敗)
IMAP協議(Internet Message Access Protocol)Internet訊息訪問協議(預設埠143):
它是對POP3協議的一種擴充套件,也是定義了郵件客戶端軟體和IMAP郵件伺服器的通訊規則,它執行在TCP/IP協議之上,與POP3的主要區別
是這個IMAP協議可以線上操作,可以不用把使用者的所有郵件下載,可以通過客戶端直接對伺服器上的郵件線上操作
2:郵件傳送的基本流程
下面我簡單列舉使用者A給使用者B傳送郵件的簡單流程圖,分別以網易郵箱和企鵝郵箱來演示
①:使用者A(xx@163.com)在郵件客戶端登入自己的郵箱賬號密碼;並通過郵件客戶端編寫一封郵件(收件人xx@qq.com),
將寫好的郵件交到163郵箱伺服器裡的SMTP伺服器裡
②:163郵箱伺服器會對使用者A傳送的郵件進行解析,解析收件人的郵箱
收件人的郵箱是163郵箱:
直接把郵件存放到自己的163內部郵件伺服器儲存空間裡
收件人的郵箱為外部郵箱(QQ郵箱、新浪郵箱..):
SMTP伺服器使用SMTP的協議將當前的郵件在網際網路中轉發到指定位置的郵件伺服器裡的SMTP伺服器
③:QQ郵箱伺服器通過SMTP協議接收到了163郵箱伺服器傳送過來的郵件,此時QQ郵箱伺服器也會解析163發過來的郵件是否是自己的;
此時發現發過來的郵件是自己的,那麼QQ郵箱就會把接收過來的郵件儲存在QQ郵箱內部的郵件儲存空間裡
④:使用者B(xx@qq.com)在郵件客戶端登入自己的郵箱賬號密碼;然後使用者B想看她此時接收的郵件;這時就到第四步了,郵件客戶端
會使用POP3協議連線到QQ郵箱內的POP3伺服器
⑤:POP3接收到了請求後,POP3伺服器會去QQ郵箱內部的郵件儲存伺服器內獲取到對應使用者下的全部郵件並返回給POP3伺服器
⑥:POP3伺服器獲取到使用者B的郵件後會將使用者B的郵件返會給指定使用者的郵件客戶端裡
二:使用SMTP協議的163/QQ郵箱傳送郵件
1:163/QQ郵箱準備
去註冊個163郵箱,註冊完以後我們需要手動開啟 IMAP/SMTP服務 和 POP3/SMTP服務 正好對應著SMTP協議和POP3協議;開啟後我們會得到郵箱客戶端連線的授權密碼,以後登入其它郵件客戶端需要此授權碼
網易郵箱:
QQ郵箱:
2:開啟telnet客戶端服務
Win+R開啟執行並輸入OptionalFeatures即可開啟【Windows功能】;然後找到 Telnet 客戶端 多選框打勾就開啟此服務了
若未開啟Telnet客戶端則執行會爆 "不是內部或外部命令"
3:郵件傳送(SMTP)的基本命令
SMTP協議(Simple Mail Transfer Protocol):簡單郵件傳輸協議,它定義了郵件客戶端軟體和SMTP郵件伺服器之間以及兩臺SMTP郵件伺服器之間的通訊規則。SMTP協議的通訊雙方採用一問一答的命令/響應形式進行對話,SMTP協議分為標準SMTP協議和擴充套件SMTP協議,標準SMTP協議是1982年在RFC821 文件中定義的,而擴充套件SMTP協議是1995年在RFC1869 文件中定義的。擴充套件SMTP協議在標準 SMTP協議基礎上的改動非常小,主要增加了郵件安全方面的認證功能,現在我們說的SMTP協議基本上都是擴充套件SMTP協議。
RFC1869文件參考如下:https://tools.ietf.org/html/rfc1869
SMTP協議中一共定義了18條命令,但是傳送一封電子郵件的過程通常只需要6條命令,我針對這6條簡單介紹:
命令:ehlo<SP><domain><CRLF>
ehlo命令是SMTP郵件傳送程式與SMTP郵件接收程式建立連線後必須傳送的第一條SMTP命令,引數<domain>表示SMTP郵件傳送者的主機名,
ehlo命令用於替代傳統SMTP協議中的helo(對於部分郵箱還只能使用helo)命令
命令:auth<SP><para><CRLF>
如果SMTP郵件接收程式需要SMTP郵件傳送程式進行認證時,它會向SMTP郵件傳送程式提示它所採用的認證方式,SMTP郵件傳送程式接著
應該使用這個命令回應SMTP郵件接收程式,引數<para>表示回應的認證方式,通常是SMTP郵件接收程式先前提示的認證方式
命令:mail<SP>from:<reverse-path><CRLF>
此命令用於指定郵件傳送者的郵箱地址,引數<reverse-path>表示發件人的郵箱地址
命令:rcpt<SP>to:<forword-path><CRLF>
此命令用於指定郵件接收者的郵箱地址,引數<forword-path>表示收件人的郵箱地址,如果郵件要傳送給多個接收者,
那麼應該使用多條rcpt<SP>to命令來分別指定每一個接收者的郵箱地址
命令:data<CRLF>
此命令用於表示SMTP郵件傳送程式準備開始傳送郵件內容,在這個命令後面傳送的所有資料都將被當做郵件內容,
直到遇到"<CRLF>.<CRLF>"識別符號,則表示郵件內容結束
命令:quit<CRLF>
此命令表示要結束郵件傳送過程,SMTP郵件接收程式接收到此命令後,將關閉與SMTP郵件伺服器的連線
注:<SP>代表空格 <CRLF>代表回車換行
4:使用網易163/QQ郵箱傳送郵件
SMTP協議用來傳送郵件
傳送郵箱基本流程: ①:和網易郵箱的SMTP伺服器建立連線(smtp.163.com為SMTP伺服器地址,25為SMTP伺服器埠) telnet smtp.163.com 25
若使用QQ郵箱登入則是 telnet smtp.qq.com 587 ②:使用ehlo命令告知傳送者的使用者名稱 ehlo tom ③:選擇登入認證方式 auth login ④:分別輸入加密後的使用者名稱和密碼 eHh4QDE2My5jb20= 注:對應郵箱 xxx@163.com YnF3ZWhod2VyMzI= 注:對應郵箱的授權密碼 bqwehhwer32(開啟的SMTP服務時的那個授權碼) ⑤:指明發件人郵箱和收件人郵箱 mail from:<xxx@163.com> rcpt to:<xxx@qq.com> ⑥:編寫傳送的郵箱內容(必須按照規範) data -->回車 from:<xxx@163.com> 注:發件人 to:<xxx@qq.com> 注:收件人 subject:hello world 注:subject郵件頭主題 注:空行 Hello! My little baby. 注:郵件內容 . 注:點代表結束輸入-->再回車結束 ⑦:結束連線 quit
三:使用POP3協議的163/QQ郵箱接收郵件
1:郵件接收(POP3)的基本命令
命令:user<SP>username<CRLF>
是P0P3客戶端程式與P0P3郵件伺服器建立連線後傳送的第一條命令,引數username表示收件人的賬戶名稱(不用base64)
命令:pass<SP>password<CRLF>
是在user命令成功執行後,POP3客戶端程式接著傳送的命令,引數password表示賬戶的密碼(不用base64)
命令:apop<SP>name,digest<CRLF>
用於替代user和pass命令,它以MD5數字摘要的形式向POP3郵件伺服器提供賬戶和密碼
https://datatracker.ietf.org/doc/html/rfc1321
命令:stat<CRLF>
stat命令用於查詢郵箱中的統計資訊,後面的兩個數字分別表示郵件數目和佔用位元組大小
命令:uidl<SP>msg#<CRLF>
uidl命令用於查詢某封郵件的唯一識別符號,引數msg#表示郵件的序號,是一個從1開始的編號
命令:list<SP>[msg#]<CRLF>
用於列出郵箱中的郵件資訊,引數msg#是一個可選引數,表示郵件的序號。當不指定參
數時,列出所有的郵件資訊;指定引數,那麼只列出指定郵件資訊
命令:retr<SP>msg#<CRLF>
retr命令用於獲取某封郵件的內容,引數msg#表示郵件的序號
命令:dele<SP>msg#<CRLF>
dele命令用於在某封郵件上設定刪除標記,引數msg#表示郵件的序號。當POP3伺服器執行dele命
令時,只是設定刪除標記,並不直接刪除郵件。當POP3伺服器執行quit命令退出時,POP3伺服器
才會刪除所有被標記的郵件
命令:rset<CRLF>
rset命令用於清除所有郵件的刪除標記
命令:top<SP>msg#<SP>n<CRLF>
top命令用於獲取序號為msg的郵件的前n行內容(正文)
命令:noop<CRLF>
用於檢查POP3客戶端與POP3伺服器的連線情況
命令:quit<CRLF>
quit命令表示要結束郵件接收過程,執行此命令,POP3伺服器會刪除所有標記了刪除了的郵件,
並關閉與POP3客戶端的網路連線
2:使用163/QQ郵箱接收郵件
POP3協議用來接收郵件
接收郵箱基本流程操作:
①:和網易郵箱的POP3伺服器建立連線(pop3.163.com為POP3伺服器地址,110為POP3伺服器埠)
telnet pop.163.com 110
若使用QQ郵箱登入則是 telnet pop.qq.com 110
注:若pop3無法連線則使用pop連線
②:傳送一條命令建立連線,此時需要寫出要登入郵箱的使用者名稱(非base64)
user antladdie
④:告知伺服器當前使用者的密碼,注意的是授權碼(非base64)
pass QWERTYUIOPPOIUYT
163郵箱登入成功會返回+OK 2 message(s) [4500 byte(s)] 代表有兩封郵件,總大小4500位元組
四:常用郵箱伺服器的POP3/SMTP地址埠
郵箱名稱 POP3伺服器地址 SMTP伺服器地址 QQ郵箱 pop.qq.com(埠:110) smtp.qq.com(埠:25) QQ企業郵箱 pop.exmail.qq.com (SSL啟用 埠:995) smtp.exmail.qq.com(SSL啟用 埠:587/465) 163.com pop.163.com(埠:110) smtp.163.com(埠:25) sina.com pop3.sina.com.cn(埠:110) smtp.sina.com.cn(埠:25) sina.cn pop3.sina.com(埠:110) smtp.sina.com(埠:25) sinaVIP pop3.vip.sina.com (埠:110) smtp.vip.sina.com (埠:25) sohu.com pop3.sohu.com(埠:110) smtp.sohu.com(埠:25) 126郵箱 pop.126.com(埠:110) smtp.126.com(埠:25) 139郵箱: POP.139.com(埠:110) SMTP.139.com(埠:25) yahoo.com pop.mail.yahoo.com(110) smtp.mail.yahoo.com(465) yahoo.com.cn pop.mail.yahoo.com.cn(埠:995) smtp.mail.yahoo.com.cn(埠:587 HotMail pop3.live.com(埠:995) smtp.live.com(埠:587) gmail(google.com) pop.gmail.com(SSL啟用埠:995) smtp.gmail.com(SSL啟用 埠:587) 263.net pop3.263.net(埠:110) smtp.263.net(埠:25) 263.net.cn pop.263.net.cn(埠:110) smtp.263.net.cn(埠:25) x263.net pop.x263.net(埠:110) smtp.x263.net(埠:25) 21cn.com pop.21cn.com(埠:110) smtp.21cn.com(埠:25) Foxmail POP.foxmail.com(埠:110) SMTP.foxmail.com(埠:25) china.com: pop.china.com(埠:110) smtp.china.com(埠:25) tom.com pop.tom.com(埠:110) smtp.tom.com(埠:25) etang.com pop.etang.com smtp.etang.com
五:常見失敗編碼速查
421
421 HL:REP
該IP傳送行為異常,存在接收者大量不存在情況,被臨時禁止連線。請檢查是否有使用者傳送病毒或者垃圾郵件,並核對傳送列表有效性;
421 HL:ICC
該IP同時併發連線數過大,超過了網易的限制,被臨時禁止連線。請檢查是否有使用者傳送病毒或者垃圾郵件,並降低IP併發連線數量;
421 HL:IFC
該IP短期內傳送了大量信件,超過了網易的限制,被臨時禁止連線。請檢查是否有使用者傳送病毒或者垃圾郵件,並降低傳送頻率;
421 HL:MEP
該IP傳送行為異常,存在大量偽造傳送域域名行為,被臨時禁止連線。請檢查是否有使用者傳送病毒或者垃圾郵件,並使用真實有效的域名傳送;
450
450 MI:CEL 傳送方出現過多的錯誤指令。請檢查發信程式;
450 MI:DMC 當前連線傳送的郵件數量超出限制。請減少每次連線中投遞的郵件數量;
450 MI:CCL 傳送方傳送超出正常的指令數量。請檢查發信程式;
450 RP:DRC 當前連線傳送的收件人數量超出限制。請控制每次連線投遞的郵件數量;
450 RP:CCL 傳送方傳送超出正常的指令數量。請檢查發信程式;
450 DT:RBL 發信IP位於一個或多個RBL裡。請參考http://www.rbls.org/關於RBL的相關資訊;
450 WM:BLI 該IP不在網易允許的傳送地址列表裡;
450 WM:BLU 此使用者不在網易允許的發信使用者列表裡;
451
451 DT:SPM ,please try again
郵件正文帶有垃圾郵件特徵或傳送環境缺乏規範性,被臨時拒收。請保持郵件佇列,兩分鐘後重投郵件。需調整郵件內容或優化傳送環境
451 Requested mail action not taken: too much fail authentication
登入失敗次數過多,被臨時禁止登入。請檢查密碼與帳號驗證設定;
451 RP:CEL 傳送方出現過多的錯誤指令。請檢查發信程式;
451 MI:DMC 當前連線傳送的郵件數量超出限制。請控制每次連線中投遞的郵件數量;
451 MI:SFQ 發信人在15分鐘內的發信數量超過限制,請控制發信頻率;
451 RP:QRC 發信方短期內累計的收件人數量超過限制,該發件人被臨時禁止發信。請降低該使用者發信頻率;
•451 Requested action aborted: local error in processing 系統暫時出現故障,請稍後再次嘗試傳送;
500
500 Error: bad syntaxU 傳送的smtp命令語法有誤;
550 MI:NHD HELO命令不允許為空;
550 MI:IMF 發信人電子郵件地址不合規範。請參考http://www.rfc-editor.org/關於電子郵件規範的定義;
550 MI:SPF 發信IP未被髮送域的SPF許可。請參考http://www.openspf.org/關於SPF規範的定義;
550 MI:DMA 該郵件未被髮信域的DMARC許可。請參考http://dmarc.org/關於DMARC規範的定義;
550 MI:STC 發件人當天的連線數量超出了限定數量,當天不再接受該發件人的郵件。請控制連線次數;
550 RP:FRL 網易郵箱不開放匿名轉發(Open relay);
550 RP:RCL 群發收件人數量超過了限額,請減少每封郵件的收件人數量;
550 RP:TRC 發件人當天內累計的收件人數量超過限制,當天不再接受該發件人的郵件。請降低該使用者發信頻率;
550 DT:SPM 郵件正文帶有很多垃圾郵件特徵或傳送環境缺乏規範性。需調整郵件內容或優化傳送環境;
550 Invalid User 請求的使用者不存在;
550 User in blacklist 該使用者不被允許給網易使用者發信;
550 User suspended 請求的使用者處於禁用或者凍結狀態;
550 Requested mail action not taken: too much recipient 群發數量超過了限額;
552
552 Illegal Attachment 不允許傳送該型別的附件,
包括以.uu .pif .scr .mim .hqx .bhx .cmd .vbs .bat .com .vbe .vb .js .wsh等結尾的附件;
552 Requested mail action aborted: exceeded mailsize limit 傳送的信件大小超過了網易郵箱允許接收的最大限制;
-553
553 Requested action not taken: NULL sender is not allowed 不允許發件人為空,請使用真實發件人傳送;
553 Requested action not taken: Local user only SMTP型別的機器只允許發信人是本站使用者;
553 Requested action not taken: no smtp MX only MX型別的機器不允許發信人是本站使用者;
553 authentication is required SMTP需要身份驗證,請檢查客戶端設定;
-554
554 DT:SPM 傳送的郵件內容包含了未被許可的資訊,或被系統識別為垃圾郵件。請檢查是否有使用者傳送病毒或者垃圾郵件;
554 DT:SUM 信封發件人和信頭髮件人不匹配;
554 IP is rejected, smtp auth error limit exceed 該IP驗證失敗次數過多,被臨時禁止連線。請檢查驗證資訊設定;
554 HL:IHU 發信IP因傳送垃圾郵件或存在異常的連線行為,被暫時掛起。請檢測發信IP在歷史上的發信情況和發信程式是否存在異常;
554 HL:IPB 該IP不在網易允許的傳送地址列表裡;
554 MI:STC 發件人當天內累計郵件數量超過限制,當天不再接受該發件人的投信。請降低發信頻率;
554 MI:SPB 此使用者不在網易允許的發信使用者列表裡;
554 IP in blacklist 該IP不在網易允許的傳送地址列表裡。
六:常用Multipart型別
每個郵件的詳細中都會存在一個Content-Type屬性,從中我們可以看出此時的郵件型別
MIME郵件中各種不同型別的內容是分段儲存的,各個段的排列方式、位置資訊都通過Content-Type域的multipart型別來定義。
multipart型別主要有三種子型別:mixed、alternative、related
①:multipart/mixed型別:
如果一封郵件中含有附件,那郵件的Content-Type域中必須定義multipart/mixed型別,郵件通過multipart/mixed型別中定義
的boundary標識將附件內容同郵件其它內容分成不同的段。基本格式如下:
Content-Type:multipart/mixed;
boundary="{分段標識}"
②:multipart/alternative型別:
MIME郵件可以傳送超文字內容,但出於相容性的考慮,一般在傳送超文字格式內容的同時會同時傳送一個純文字內容的副本,如果郵件中同時存在
純文字和超文字內容,則郵件需要在Content-Type域中定義multipart/alternative型別,郵件通過其boundary中分段標識將純文字、超文
本和郵件的其它內容分成不同的段。基本格式如下:
Content-Type:multipart/alternative;
boundary="{分段標識}"
③:multipart/related型別:
MIME郵件中可以攜帶各種附件外,還可以將其它內容以內嵌資源的方式儲存在郵件中。比如我們在傳送html格式的郵件內容時,可能使用影像作
為html的背景,html文字會被儲存在alternative段中,而作為背景的影像則會儲存在multipart/related型別定義的段中。基本格式如下:
Content-Type:multipart/related;
type="multipart/alternative";
boundary="{分段標識}"
multipart型別的boundary屬性
multipart的子型別中都定義了各自的boundary屬性,郵件使用這些boundary中定義的字串作為標識,將郵件內容分成不同的段,段體內
的每個子段以“--”+boundary行開始,父段則以“--”+boundary+“--”行結束,不同段之間用空行分隔。
在看完上面的一篇文章後可以手工使用telnet來傳送SMTP郵件和接收POP3郵件,後面我將會使用JAVA程式碼帶大家徹底在公司中使用程式碼完成郵件傳送,如果上面一篇文章認真看完,那我相信您對後面使用程式碼來傳送郵件的流程會了如指掌。