Posted on 2006-09-18 15:11
小小涼粉 閱讀(2643)
評論(5) 編輯 收藏 所屬分類:
JavaSE
SMTP的連接和收發過程:
a.建立TCP連接。
b.客戶端發送HELO命令以標識發件人自己的身份,然后客戶端發送MAIL命令服務器端正希望以OK作為響應,表明準備接收。
c.客戶端發送RCPT命令,以標識該電子郵件的計劃接收人,可以有多個RCPT行
d.協商結束,發送郵件,用命令DATA發送
e.以.表示結束輸入內容一起發送出去
f.結束此次發送,用QUIT命令退出。
SMTP的基本命令集:
HELO 向服務器標識用戶身份
MAIL 初始化郵件傳輸mail from:
RCPT 標識單個的郵件接收人;常在MAIL命令后面可有多個rcpt to:
DATA 在單個或多個RCPT命令后,表示所有的郵件接收人已標識,初始化數據傳輸,以.結束。
NOOP 無操作,服務器應響應OK
RSET 重置會話,當前傳輸被取消
QUIT 結束會話
POP3簡介:
在POP3協議中有三種狀態,認可狀態,處理狀態,和更新狀態。當客戶機與服務器建立聯系時,一旦客戶機提供了自己身份并成功確認,即由認可狀態轉入處理狀態,在完成相應的操作后客戶機發出quit命令,則進入更新狀態,更新之后最后重返認可狀態。
POP3基本命令集:
USER username
PASS password
STAT 請求服務器發回關于郵箱的統計資料,如郵件總數和總字節數
LIST 返回郵件數量和每個郵件的大小
RETR [Msg#] 返回由參數標識的郵件的全部文本
DELE [Msg#] 服務器將由參數標識的郵件標記為刪除,由quit命令執行
RSET 服務器將重置所有標記為刪除的郵件,用于撤消DELE命令
NOOP 服務器返回一個肯定的響應
QUIT 更新
class POP3Demo {
?? private static String POP3Server = "pop.126.com";
??? private static String USERNAME = "username";//實際應用中改成真實的用戶名
??? private static String PASSWORD = "password";//實際應用中改成真實的密碼
??? public static void main(String[] args) {
??????? int POP3Port = 110;
??????? Socket client = null;
??????? try {
??????????? // 向POP3服務程序建立一個套接字連接。
??????????? client = new Socket(POP3Demo.POP3Server, POP3Port);
??????????? // 創建一個BufferedReader對象,以便從套接字讀取輸出。
??????????? InputStream is = client.getInputStream();
??????????? BufferedReader sockin = new BufferedReader(new InputStreamReader(is));
??????????? // 創建一個PrintWriter對象,以便向套接字寫入內容。
??????????? OutputStream os = client.getOutputStream();
??????????? PrintWriter sockout = new PrintWriter(os, true);
??????????? // 顯示同SMTP服務程序的握手過程。
??????????? System.out.println("S:" + sockin.readLine());
??????????? sockout.println("user " + POP3Demo.USERNAME);
??????????? System.out.println("S:" + sockin.readLine());
??????????? sockout.println("pass " + POP3Demo.PASSWORD);
??????????? System.out.println("S:" + sockin.readLine());
??????????? sockout.println("stat");
??????????? String temp[] = sockin.readLine().split(" ");
??????????? int count = Integer.parseInt(temp[1]);//得到信箱中共有多少封郵件
??????????? for (int i = 1; i < count + 1; i++) {//依次打印出郵件的內容
??????????????? sockout.println("retr " + i);
??????????????? System.out.println("以下為第" + i + "封郵件的內容");
??????????????? while (true) {
??????????????????? String reply = sockin.readLine();
??????????????????? System.out.println(reply);
??????????????????? if (reply.toLowerCase().equals(".")) {
??????????????????????? break;
??????????????????? }
??????????????? }
??????????? }
??????? } catch (IOException e) {
??????????? System.out.println(e.toString());
??????? } finally {
??????????? try {
??????????????? if (client != null) {
??????????????????? client.close();
??????????????? }
??????????? } catch (IOException e) {}
??????? }
??? }
}
?class SMTPDemo {
??? //以下三項請在使用時改成真實的信箱地址
??? //并且注意,SMTPServer和receiver必須是同一個服務器
??? private static String sender = "sender";
??? private static String receiver = "receiver";
??? private static String SMTPServer = "smtpserver";
??? public static void main(String[] args) {
??????? int SMTPPort = 25;
??????? Socket client = null;
??????? try {
??????????? // 向SMTP服務程序建立一個套接字連接。
??????????? client = new Socket(SMTPDemo.SMTPServer, SMTPPort);
??????????? // 創建一個BufferedReader對象,以便從套接字讀取輸出。
??????????? InputStream is = client.getInputStream();
??????????? BufferedReader sockin = new BufferedReader(new InputStreamReader(is));
??????????? // 創建一個PrintWriter對象,以便向套接字寫入內容。
??????????? OutputStream os = client.getOutputStream();
??????????? PrintWriter sockout = new PrintWriter(os, true);
??????????? // 顯示同SMTP服務程序的握手過程。
??????????? System.out.println("S:" + sockin.readLine());
??????????? sockout.println("helo");
??????????? System.out.println("S:" + sockin.readLine());
??????????? sockout.println("mail from: " + "<" + SMTPDemo.sender + ">");
??????????? System.out.println("S:" + sockin.readLine());
??????????? sockout.println("rcpt to: " + "<" + SMTPDemo.receiver + ">");
??????????? System.out.println("S:" + sockin.readLine());
??????????? sockout.println("data");
??????????? //發送郵件標題
??????????? sockout.println("subject: 你好");
??????????? //發送郵件內容
??????????? sockout.println("ni hao");
??????????? sockout.println("wo shi li jian");
??????????? //此處的.為特殊標記,表示郵件結束
??????????? sockout.println(".");
??????????? sockout.println("rset");
??????????? sockout.println("quit");
??????? } catch (IOException e) {
??????????? System.out.println(e.toString());
??????? } finally {
??????????? try {
??????????????? if (client != null) {
??????????????????? client.close();
??????????????? }
??????????? } catch (IOException e) {}
??????? }
??? }
}