郵件基本概念及發送方式


 一:郵件發送的基本介紹

  在工作中我相信大家會經常和郵件打交道,用郵件來進行信息的交流和匯報工作情況;但是在我們程序員眼里,郵件的用處還是挺廣泛的,比如我們在注冊賬號完成時平台會發送一封郵件給我們,讓我們點擊郵件里的鏈接來激活當前注冊的賬號;其實郵件還可以實現驗證碼的發送、用戶操作提醒、活動通知等功能

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/465163.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啟用 端口:587263.net             pop3.263.net(端口:110)                    smtp.263.net(端口:25263.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代碼帶大家徹底在公司中使用代碼完成郵件發送,如果上面一篇文章認真看完,那我相信您對后面使用代碼來發送郵件的流程會了如指掌。快來看看使用JavaMail如何操作郵箱


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM