要在Internet上提供電子郵件功能,必須有專門的電子郵件服務器。例如如今Internet不少提供郵件服務的廠商:sina、sohu、163等等他們都有本身的郵件服務器。html
這些郵件服務器相似於現實生活中的郵局,它主要負責接收用戶投遞過來的郵件,並把郵件投遞到郵件接收者的電子郵箱中。java
電子郵箱(E-Mail地址)的得到須要在郵件服務器上進行申請,確切地說,電子郵箱其實就是用戶在郵件服務器上申請的一個帳戶,用戶在郵件服務器上申請了一個賬號後,郵件服務器就會爲這個帳號分配必定的空間,用戶從而可使用這個賬號以及空間發送電子郵件和保存別人發送過來的電子郵件。小程序
用戶鏈接上郵件服務器以後,要想給它發送一封電子郵件,須要遵循必定的通信規則,SMTP協議就是用來定義這種通信規則的。所以,咱們一般也把處理用戶smtp請求(郵件發送請求)的服務器稱之爲SMTP服務器(郵件發送服務器)。服務器
一樣,用戶若想從郵件服務器管理的電子郵箱當中接收一封電子郵件話,它連上郵件服務器後,也要遵循必定的通信格式,POP3協議就是用來定義這種通信格式的。所以,咱們一般也把處理用戶pop3請求(郵件接收請求)的服務器稱之爲POP3服務器(郵件接收服務器)。網絡
經過一張圖來講明一封郵件的發送和接收過程,以下圖所示:工具
簡單說一下這個郵件收發過程:ui
一、xdp@sohu.com 用戶寫好一封Email發送到sohu的Smtp服務器。對應於上圖的步驟①編碼
二、sohu的Smtp服務器開始處理xdp@sohu.com 用戶的請求,它會根據收件人的地址判斷,當前收件人是否是本身管轄的用戶,若是是,就直接將Email存放到爲該收件人的分配的郵箱空間當中。sohu的Smtp服務器判斷收件人地址發現,這一封Email的收件人gacl@sina.com 是Sina的郵件服務器管理的,因而又將Email轉發給Sina的Smtp服務器。對應於上圖的步驟②加密
三、Sina的Smtp服務器開始處理sohu的Smtp服務器發送過來的Email,Sina的Smtp服務器根據收件人的地址判斷,發現收件人本身管轄的用戶,因而就直接將Email存放到爲gacl@sina.com 用戶的分配的郵箱空間當中。對應於上圖的步驟③。spa
四、xdp@sohu.com 用戶將郵件發出去以後,就通知gacl@sina.com 用戶去收取。gacl@sina.com 用戶因而就鏈接上Sina的POP3服務器收取郵件,對應於上圖的步驟④。
五、POP3服務器從gacl@sina.com 用戶的郵箱空間當中取出Email,對應於步驟⑤。
六、POP3服務器將取出來的Email發給gacl@sina.com 用戶,對應於步驟⑥。
使用smtp協議發送郵件給郵件服務器時規定了要作如下幾件事
一、使用"ehlo"命令和鏈接上的smtp服務器打聲招呼,例如:
ehlo gacl
二、使用"auth login"命令登陸到Smtp服務器,登陸使用的用戶名和密碼必須通過Base64加密,例如:
①、輸入命令:auth login
②、輸入使用Base64加密事後的用戶名:Z2FjbA==
③、輸入Base64加密事後的密碼:MTIzNDU2
三、指明郵件的發件人和收件人
mail from:<gacl@sohu.com>
rcpt to:<xdp_gacl@sina.cn>
四、編寫要發送的郵件內容,郵件的編寫格式是有必定的規則的,一封格式良好的郵件應該包含郵件頭和郵件的主體內容。
郵件頭使用下面的三個字段來指明
郵件的內容包含了這些信息以後纔是一封格式良好的郵件。
①、輸入"data"命令
data
②、編寫郵件內容
from:<gacl@sohu.com> ----郵件頭
to:<xdp_gacl@sina.cn> ----郵件頭
subject:hello ----郵件頭
-----空行
hello gacl ----郵件的具體內容
五、輸入一個.告訴郵件服務器郵件內容已經寫完了
.
六、輸入quit命令斷開與郵件服務器的鏈接
quit
以上的6個步驟就是Smtp協議規定的發送一封Email必需要作的事情。
在對Smtp協議有必定的瞭解以後,咱們就可使用Smtp協議來發送郵件了。下面演示一下使用Telnet客戶端鏈接上搜狐的郵件服務器而後發一封Email到新浪的郵箱中去
爲了可以對Smtp協議有一個直觀的認識,這裏咱們不借助任何第三方郵件客戶端工具,而是使用最原始的的Telnet客戶端來完成郵件的發送過程,Telnet是一個Window自帶的網絡客戶端程序,經過它能夠鏈接上互聯網上面的任意一臺主機。
使用telnet客戶端鏈接到搜狐的smtp服務器,以下圖所示:
經過telnet客戶端發Email,以下圖所示:
咱們登陸到<xdp_gacl@sina.cn>郵箱當中,就能夠收取到由<gacl@sohu.com>發送的Email了,以下圖所示:
這就是使用Smtp協議發送郵件的過程。
POP3協議規定了收取郵件時要作如下幾件事
①、輸入用戶名和密碼登陸到POP3服務器,用戶名和密碼不須要通過Base64加密
user username --登陸郵箱的用戶名
pass password --登陸郵箱使用的密碼
②、使用retr命令收取郵件
retr 數字 收取郵件,retr 1表示收取郵箱當中的第一封郵件,這是POP3協議裏面最重要的一個命令。
在使用retr命令收取郵件以前,可使用以下的兩個命令查看一下郵箱裏面的郵件的一些相關信息。
stat
返回郵箱裏面的郵件數量以及郵件佔用的空間大小信息
list 數字
返回某一封郵件的統計信息
③、郵件收取完成以後使用quit命令斷開與POP3服務器的鏈接。
quit 斷開與POP3服務器的鏈接
收取郵件咱們也不借助任何第三方客戶端工具,而是使用Telnet客戶端鏈接到POP3服務器進行收取。
例如:如今個人搜狐郵箱當中有這樣的一封郵件,以下圖所示:
如今咱們不用使用foxmail或者outLook這樣的客戶端工具去收取,而是使用Telnet客戶端鏈接到搜狐的POP3服務器去手工收取。
一、使用Telnet鏈接上搜狐的POP3服務器,使用命令:telnet pop3.sohu.com 110,以下圖所示:
根據POP3協議規定的郵件收取步驟來收取郵件。以下圖所示:
能夠看到,咱們POP3協議純手工從搜狐的POP3服務器當中收取回來了一封Email,Email裏面的內容都通過了Base64編碼處理,下面咱們寫一個小程序將通過Base64編碼後的郵件內容進行解碼,還原回郵件的內容,代碼以下:
1 package me.gacl.encrypt; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 7 import sun.misc.BASE64Decoder; 8 import sun.misc.BASE64Encoder; 9 10 public class Base64Encrypt { 11 12 public static void main(String args[]) throws IOException{ 13 /*System.out.print("請輸入用戶名:"); 14 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 15 String userName = in.readLine(); 16 System.out.print("請輸入密碼:"); 17 String password = in.readLine(); 18 BASE64Encoder encoder = new BASE64Encoder(); 19 System.out.println("編碼後的用戶名爲:" + encoder.encode(userName.getBytes())); 20 System.out.println("編碼後的密碼爲:" + encoder.encode(password.getBytes()));*/ 21 22 BASE64Decoder decoder = new BASE64Decoder(); 23 //郵件主題的Base64編碼 24 String emailSubject = "=?GBK?B?08q8/rLiytQ=?="; 25 //郵件文本內容的Base64編碼 26 String emailPlainContent = "vPK1pbXE08q8/reiy82y4srUo6E="; 27 //帶html標籤和郵件內容的Base64編碼 28 String emailHtmlContent = "PFA+vPK1pbXE08q8/reiy82y4srUo6E8L1A+"; 29 //將使用Base64編碼事後的文本內容再使用Base64來解碼 30 emailSubject = new String(decoder.decodeBuffer(emailSubject),"GBK"); 31 emailPlainContent = new String(decoder.decodeBuffer(emailPlainContent),"GBK"); 32 emailHtmlContent = new String(decoder.decodeBuffer(emailHtmlContent),"GBK"); 33 System.out.println("郵件標題:"+emailSubject); 34 System.out.println("郵件內容:"+emailPlainContent); 35 System.out.println("帶html標籤的郵件內容:"+emailHtmlContent); 36 } 37 }
運行結果以下:
這就是使用POP3協議收取郵件的過程。
以上就是郵件的發送與接收原理的相關內容,這一篇文章主要是介紹郵件發送和接收過程當中使用到的smtp協議和pop3協議。沒有涉及到太多代碼方面的東西,後面會具體介紹使用JavaMail來進行郵件發送。