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