(1)郵件服務器介紹
Ø 功能:
ü 接收用戶投遞的郵件;
ü 將用戶投遞進來的郵件轉發給目標郵件服務器;
ü 接收其他郵件服務器轉發來的郵件並把郵件存儲到其管理的用戶郵箱;
ü 爲前來讀取郵件的用戶提供讀取服務;
Ø 郵件服務器按通訊協議可以劃分爲兩種類型:
ü SMTP服務器;
ü POP3/IMAP服務器;
注:SMTP服務器用於替用戶發送郵件和接收外面發送給本地用戶的郵件,相當於現實生活中的郵局的郵件接收部門(可接收普通客戶要投出的郵件和其他郵局投遞進來的郵件)(一發一收,發送與接收 – 同樣的協議);POP3/IMAP郵件服務器用於幫助用戶讀取SMTP服務器接收進來的該用戶的郵件,相當於專門爲前來取包裹的用戶提供服務的部門(用戶詢問,爲用戶取郵件);所以要注意”收”(SMTP)與”取”(POP3)的區別。
Ø 郵件客戶端軟件:
郵件客戶端軟件負責與郵件服務器通訊,主要用於幫助用戶將郵件發送給SMTP服務器
和從POP3/IMAP郵件服務器讀取用戶的電子郵件。郵件客戶端軟件通常集郵件撰寫、發送和接收功能爲一體。
Ø SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地
址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。SMTP協議屬於TCP/IP協議族,它幫助每臺計算機在發送或中轉信件時找到下一個目的地。通過SMTP協議所指定的服務器,就可以把E-mail寄到收信人的服務器上了,整個過程只要幾分鐘。SMTP服務器則是遵循SMTP協議的發送郵件服務器,用來發送或中轉發出的電子郵件。
Ø IMAP,即Internet Message Access Protocol(互聯網郵件訪問協議),您可以通過
這種協議從郵件服務器上獲取郵件的信息、下載郵件等。IMAP與POP類似,都是一種郵件獲取協議。
Ø IMAP和POP有什麼區別?
POP允許電子郵件客戶端下載服務器上的郵件,但是您在電子郵件客戶端的操作(如:移動郵件、標記已讀等),這是不會反饋到服務器上的,比如:您通過電子郵件客戶端收取了QQ郵箱中的3封郵件並移動到了其他文件夾,這些移動動作是不會反饋到服務器上的,也就是說,QQ郵箱服務器上的這些郵件是沒有同時被移動的 。但是IMAP就不同了,電子郵件客戶端的操作都會反饋到服務器上,您對郵件進行的操作(如:移動郵件、標記已讀等),服務器上的郵件也會做相應的動作。也就是說,IMAP是“雙向”的。同時,IMAP可以只下載郵件的主題,只有當您真正需要的時候,纔會下載郵件的所有內容。
Ø 電子郵件客戶端:
Foxmail
Outlook Express
Outlook 2003
Outlook 2007
無線設備:
注意:手機上網用戶使用IMAP服務器需要CMNET網絡。
(2) WIN7 cmd下運行不了telnet命令
安裝Win7下的Telnet和Windows Server 2008略有不同,用戶可以通過下面的操作方法實現:
依次點擊“開始”→“控制面板”→“程序”→“在程序和功能”找到並點擊“打開
或關閉Windows功能”進入Windows 功能設置對話框找到並勾選“Telnet客戶端”和“Telnet服務器”→“確定”稍等片刻即可完成安裝。
自己按照提示完成後,發現還是不行,後來嘗試ping命令也不行,纔想起可能是環境變量沒有配置。在環境變量的path裏把 c:/windows/system32添加上就可以了。
(3) 通過命令行的形式連接郵件服務器併發送郵件
ü 連接郵件服務器:telnet smtp.sina.com 25;
ü 與服務器“打招呼”:ehlo yilong7797,然後服務端會需要你輸入用戶名和密碼進行
身份驗證,一般支持兩種情況的驗證方式:PLAIN和LOGIN;
ü 選擇LOGIN驗證方式:auth login,進而服務器就要求你輸入用戶名和密碼,要注意的
是必須先轉換成BASE64的編碼格式;以下給出轉換的程序:
package com.yilong.javamail;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import sun.misc.BASE64Encoder;
public class Basic64Util {
public static void main(String[] args) throws IOException {
BASE64Encoder encoder = new BASE64Encoder();
System.out.println("please input user name:");
String username = new BufferedReader(
new InputStreamReader(System.in)).readLine();
System.out.println(encoder.encode(username.getBytes()));
System.out.println("please input password:");
String password = new BufferedReader(
new InputStreamReader(System.in)).readLine();
System.out.println(encoder.encode(password.getBytes()));
}
}
注:BASE 64介紹:Base64是網絡上最常見的用於傳輸8Bit字節代碼的編碼方式之一,在發送電子郵件時,服務器認證的用戶名和密碼需要用Base64編碼,附件也需要用Base64編碼。
下面簡單介紹Base64算法的原理,由於代碼太長就不在此貼出
Base64要求把每三個8Bit的字節轉換爲四個6Bit的字節(3*8 = 4*6 = 24),然後把6Bit再添兩位高位0,組成四個8Bit的字節,也就是說,轉換後的字符串理論上將要比原來的長1/3。
轉換後,我們用一個碼錶來得到我們想要的字符串(也就是最終的Base64編碼),這個表是這樣的:
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y
原文的字節最後不夠3個的地方用0來補足,轉換時Base64編碼用=號來代替。這就是爲什麼有些Base64編碼會以一個或兩個等號結束的原因,但等號最多隻有兩個。
舉一個例子,abc經過Base64編碼以後的結果是YWJj.
ü 發送郵件:指定發件人:mail from: <[email protected]>; 然後指定收件
人:rcpt to: <[email protected]>; 輸入data命令;郵件內容頭部:from:<[email protected]>; 輸入正文:subject:The text you want to send;最後不要忘記輸入點號”.”作爲郵件結束的標誌;
ü 登錄sohu的pop3服務器收取郵件,telnet pop3.sohu.com 110;
ü 輸入用戶名:user yilong7797; 輸入密碼:pass 111111(注:不需要使用
BASE64);
ü 使用stat命令查看郵箱中郵件的情況;使用list可以列出所有郵件的大致情況;使用
list + 編號可以查看具體的郵件;使用retr + 編號返回具體郵件的詳細信息;
ü 使用dele + 編號可以刪除具體的郵件;使用rset命令可以恢復刪除了的郵件;
(4) JAVA Mail
ü 介紹:自己寫程序發送和接收郵件,可以直接採用Socket編程連接上遠程的郵件服務
器,然後按照郵件協議與郵件服務器進行交互,涉及比較多的細節。另外,要想自己編程創建出複雜的MIME格式的郵件,是一件非常困難和麻煩的事。於是Sun公司爲方便JAVA開發人員在應用程序中實現郵件發送和接收功能而提供了一套標準開發包JavaMail,他支持一些常用的郵件協議,如SMTP、POP3、IMAP。開發人員使用JavaMail API便寫郵件處理軟件時,無需考慮郵件協議的底層實施細節,只要調用JavaMail開發包響應的API類就可以了。JavaMail也提供了能夠創建出各種複雜MIME格式的郵件內容的相關API。
注:MIME(Multipurpose Internet Mail Extensions)格式:MIME是一種保證非ASCII碼文件在internet上傳播的規格。原本是用於郵件系統傳送除了ASCII就是純文本文件的內容外,可以傳送圖片等其他格式使用的。後來,瀏覽器也支持這種規範,所以除了HTML等文本格式外,可以有很多其他格式。
ü JavaMail API按其功能劃分通常可以分爲如下三種:
Ø 創建和解析郵件內容的API:Message類是創建和解析郵件的核心API,他的實例對象代表一封電子郵件;
Ø 發送郵件的API:Transport類是發送郵件的核心API類,他的實例對象代表實現了某個郵件協議的郵件發送對象,例如:SMTP協議;
Ø 接收郵件的API:Store類是接收郵件的核心API類,他的實例對象代表實現了某個郵件協議的郵件接收對象,例如:POP3協議;
Ø 定義整個應用程序所需的環境信息,以及收集開發端與郵件服務器建立網絡連接的會話信息的類:Session類,如郵件服務器的主機名、端口號、採用的郵件發送和接收協議等。
ü JAVA生成郵件某些內容的時候需要依賴第三方的框架:JAF(JavaBeans Activation
Framework, JavaBeans激活框架)是一個專用的數據處理框架,它用於封裝數據,併爲應用程序提供訪問和操作數據的接口;JAF的主要作用在於讓Java應用程序知道如何對一個數據源進行查看、編輯和打印等操作。對於通過JAF封裝的數據,應用程序通過JAF提供的接口可以完成如下功能:
Ø 訪問數據源中的數據;
Ø 獲知數據源的數據類型;
Ø 獲知可對數據進行的各種操作;
Ø 用戶對數據執行某種操作時,自動創建執行該操作的軟件部件的實際對象;
JavaMail API可以利用JAF從某種數據源中讀取數據和獲知數據的MIME類型,並用這些數據生成MIME類型,並用這些數據生成MIME消息中的消息體和消息類型。