posts - 28, comments - 27, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Socket收發郵件--SMTP和POP3

          Posted on 2006-09-18 15:11 小小涼粉 閱讀(2646) 評論(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) {}
          ??????? }
          ??? }
          }



          評論

          # re: Socket收發郵件--SMTP和POP3  回復  更多評論   

          2006-09-19 09:16 by stoneshao
          收郵件比較容易,難點是對收到的郵件進行解析,而解析的難點是編碼問題,樓主可不可以針對這方面寫點內容啊?

          # re: Socket收發郵件--SMTP和POP3  回復  更多評論   

          2006-09-19 09:32 by 小小涼粉
          汗……

          偶這篇文章只是幫一個國外的哥們作Java作業用的

          編碼這方面我也沒有仔細研究過.....

          看看最近有沒有時間吧

          # re: Socket收發郵件--SMTP和POP3  回復  更多評論   

          2007-01-18 21:56 by 你好
          呵呵, 樓主同時也幫了偶個大忙, 偶也是在國外, 也是這個java作業
          用smtp 和pop3 收發電子郵件,

          十分感謝!!!!!~~~~~~~~

          # re: Socket收發郵件--SMTP和POP3  回復  更多評論   

          2007-01-18 22:19 by 小小涼粉
          不客氣,請支持我的新博客:dearwolf.javaeye.com吧:)

          # re: Socket收發郵件--SMTP和POP3  回復  更多評論   

          2007-04-04 16:01 by 行風
          樓主啊有沒有程序啊我門做畢業設計做郵件系的啊
          幫幫忙啊

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 太保市| 青岛市| 淮滨县| 年辖:市辖区| 乳山市| 同江市| 孟州市| 墨脱县| 云林县| 庆阳市| 株洲市| 邛崃市| 长葛市| 多伦县| 桑日县| 钦州市| 德化县| 中超| 黎平县| 常山县| 积石山| 会昌县| 林西县| 郯城县| 茌平县| 平罗县| 新余市| 普安县| 易门县| 石家庄市| 三门峡市| 甘洛县| 湟中县| 小金县| 宜兰县| 盈江县| 雷波县| 淮滨县| 托里县| 灌阳县| 博罗县|