郵件傳送和接收原理
一、 郵件開發涉及到的一些基本概念
1.1、郵件伺服器和電子郵箱
要在Internet上提供電子郵件功能,必須有專門的電子郵件伺服器。例如現在Internet很多提供郵件服務的廠商:sina、sohu、163等等他們都有自己的郵件伺服器。
這些郵件伺服器類似於現實生活中的郵局,它主要負責接收使用者投遞過來的郵件,並把郵件投遞到郵件接收者的電子郵箱中。
電子郵箱(E-Mail地址)的獲得需要在郵件伺服器上進行申請,確切地說,電子郵箱其實就是使用者在郵件伺服器上申請的一個賬戶,使用者在郵件伺服器上申請了一個帳號後,郵件伺服器就會為這個賬號分配一定的空間,使用者從而可以使用這個帳號以及空間傳送電子郵件和儲存別人傳送過來的電子郵件。
1.2、郵件傳輸協議
1.2.1、SMTP協議
使用者連線上郵件伺服器之後,要想給它傳送一封電子郵件,需要遵循一定的通訊規則,SMTP協議就是用來定義這種通訊規則的。因此,我們通常也把處理使用者smtp請求(郵件傳送請求)的伺服器稱之為SMTP伺服器(郵件傳送伺服器)。
1.2.2、POP3協議
同樣,使用者若想從郵件伺服器管理的電子郵箱當中接收一封電子郵件話,它連上郵件伺服器後,也要遵循一定的通訊格式,POP3協議就是用來定義這種通訊格式的。因此,我們通常也把處理使用者pop3請求(郵件接收請求)的伺服器稱之為POP3伺服器(郵件接收伺服器)。
1.3、電子郵件的傳送和接收過程
通過一張圖來說明一封郵件的傳送和接收過程,如下圖所示:
簡單說一下這個郵件收發過程:
1、[email protected] 使用者寫好一封Email傳送到sohu的Smtp伺服器。對應於上圖的步驟①
2、sohu的Smtp伺服器開始處理[email protected] 使用者的請求,它會根據收件人的地址判斷,當前收件人是不是自己管轄的使用者,如果是,就直接將Email存放到為該收件人的分配的郵箱空間當中。sohu的Smtp伺服器判斷收件人地址發現,這一封Email的收件人[email protected] 是Sina的郵件伺服器管理的,於是又將Email轉發給Sina的Smtp伺服器。對應於上圖的步驟②
3、Sina的Smtp伺服器開始處理sohu的Smtp伺服器傳送過來的Email,Sina的Smtp伺服器根據收件人的地址判斷,發現收件人自己管轄的使用者,於是就直接將Email存放到為[email protected] 使用者的分配的郵箱空間當中。對應於上圖的步驟③。
4、[email protected].com 使用者將郵件發出去之後,就通知[email protected] 使用者去收取。[email protected] 使用者於是就連線上Sina的POP3伺服器收取郵件,對應於上圖的步驟④。
5、POP3伺服器從[email protected] 使用者的郵箱空間當中取出Email,對應於步驟⑤。
6、POP3伺服器將取出來的Email發給[email protected] 使用者,對應於步驟⑥。
二、使用Smtp協議傳送郵件
2.1、Smtp協議講解
使用smtp協議傳送郵件給郵件伺服器時規定了要做以下幾件事
1、使用"ehlo"命令和連線上的smtp伺服器打聲招呼,例如:
ehlo gacl
2、使用"auth login"命令登入到Smtp伺服器,登入使用的使用者名稱和密碼必須經過Base64加密,例如:
①、輸入命令:auth login
②、輸入使用Base64加密過後的使用者名稱:Z2FjbA==
③、輸入Base64加密過後的密碼:MTIzNDU2
3、指明郵件的發件人和收件人
4、編寫要傳送的郵件內容,郵件的編寫格式是有一定的規則的,一封格式良好的郵件應該包含郵件頭和郵件的主體內容。
郵件頭使用下面的三個欄位來指明
-
- from欄位用於指明郵件的傳送人
- to欄位用於指明郵件的收件人
- subject欄位用於指明郵件的主題
郵件的內容包含了這些資訊之後才是一封格式良好的郵件。
①、輸入"data"命令
data
②、編寫郵件內容
subject:hello ----郵件頭
-----空行
hello gacl ----郵件的具體內容
5、輸入一個.告訴郵件伺服器郵件內容已經寫完了
.
6、輸入quit命令斷開與郵件伺服器的連線
quit
以上的6個步驟就是Smtp協議規定的傳送一封Email必須要做的事情。
2.2、使用Smtp協議手工傳送郵件
在對Smtp協議有一定的瞭解之後,我們就可以使用Smtp協議來發送郵件了。下面演示一下使用Telnet客戶端連線上搜狐的郵件伺服器然後發一封Email到新浪的郵箱中去
為了能夠對Smtp協議有一個直觀的認識,這裡我們不借助任何第三方郵件客戶端工具,而是使用最原始的的Telnet客戶端來完成郵件的傳送過程,Telnet是一個Window自帶的網路客戶端程式,通過它可以連線上網際網路上面的任意一臺主機。
使用telnet客戶端連線到搜狐的smtp伺服器,如下圖所示:
通過telnet客戶端發Email,如下圖所示:
這就是使用Smtp協議傳送郵件的過程。
三、使用POP3協議接收郵件
3.1、POP3協議講解
POP3協議規定了收取郵件時要做以下幾件事
①、輸入使用者名稱和密碼登入到POP3伺服器,使用者名稱和密碼不需要經過Base64加密
user username --登入郵箱的使用者名稱
pass password --登入郵箱使用的密碼
②、使用retr命令收取郵件
retr 數字 收取郵件,retr 1表示收取郵箱當中的第一封郵件,這是POP3協議裡面最重要的一個命令。
在使用retr命令收取郵件之前,可以使用如下的兩個命令檢視一下郵箱裡面的郵件的一些相關資訊。
stat
返回郵箱裡面的郵件數量以及郵件佔用的空間大小資訊
list 數字
返回某一封郵件的統計資訊
③、郵件收取完成之後使用quit命令斷開與POP3伺服器的連線。
quit 斷開與POP3伺服器的連線
3.2、使用POP3協議手工接收郵件
收取郵件我們也不借助任何第三方客戶端工具,而是使用Telnet客戶端連線到POP3伺服器進行收取。
例如:現在我的搜狐郵箱當中有這樣的一封郵件,如下圖所示:
現在我們不用使用foxmail或者outLook這樣的客戶端工具去收取,而是使用Telnet客戶端連線到搜狐的POP3伺服器去手工收取。
1、使用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來進行郵件傳送。