精彩的人生

          好好工作,好好生活

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks

          這里,我用pop3126.com的郵箱取到郵件,解析郵件附件。我的工作是取到jpggif圖片并保存。

           

          說明:這是我的在工作中寫的代碼,是可用的。但是有部分代碼被截取出來,比如有些參數我覺得沒有必要,就刪除了,沒有測試。可能會有bug,但是肯定是小bug

           

          連接到郵箱:
          public static void connectMail() throws Exception
              
          {
                  hostname 
          = "pop.126.com";    
                  username 
          = "yourname";
                  password 
          = "yourpassword";

                  
          //set properties
                  Properties  props = System.getProperties();
                  Session mailsession 
          = Session.getDefaultInstance(props, null);

                  
          //不輸出debug信息
                  mailsession.setDebug(false);
                  
          // Get a Store object
                  Store store = mailsession.getStore("pop3");                                1
                  
          // Connect
                  store.connect(hostname,username, password);//連接
                  
          //create a message
                  Message msg = new MimeMessage(mailsession);

                  
          //check inbox
                  Folder folder=store.getFolder("inbox");//打開收件箱
                  folder.open(Folder.READ_WRITE);//設置權限為讀寫

                  
          int msgNum = folder.getMessageCount();//得到郵件總數

                  
          //一次處理9個郵件
                  for(int i=1;i<(msgNum>10?10:msgNum+1);i++)                            2
                  
          {
                      
          try    
                      
          {
                          
          //循環解析郵件
                          msg=folder.getMessage(i);
                          
          // and now, handle the content
                          Object o = msg.getContent();

                          
          if (msg.isMimeType("multipart/*"))                            3
                          
          {
                              Multipart mp 
          = (Multipart)o;
                              
          int cnt = mp.getCount();
                              
          for ( int j = 0; j < cnt; j++)
                              
          {
                                  displayPart(mp.getBodyPart(j));
                              }

                          }
          else{
                              
          continue;
                          }

                      }
          catch (Exception e)
                      
          {
                          System.out.println(e);
                          msg.setFlag(Flags.Flag.DELETED, 
          true);                        4
                          
          continue;
                      }


                      
          //對已處理的郵件進行刪除操作
                      msg.setFlag(Flags.Flag.DELETED, true);                            5

                  }


                  
          //關閉
                  folder.close(true);                                                    6
                  store.close();                                                        
          7

            }


          1:使用的協議是pop3,因為這里不需要發送郵件,只度讀取郵件,pop3協議比較簡單方便

          2:這個函數沒有一次處理所有的郵件,因為沒有這個必要。如果需要一次處理所有郵件的話,將for循環的那部分刪除就可以了

          3message的類型可以是text/plain,text/html或者是multipart/*等類型的。但是只有multipart/*才是有附件的郵件。當然,有的郵件系統是將郵件內容作為附件來傳遞的。

          4:解析郵件的過程中可能會出現異常,比如我碰到的一個很奇怪的異常就是,當part不為null的時候,part.getFileName()拋出為空的異常。如果不捕獲這個異常,會出問題,究竟是什么問題,我在注6里講解。現在,捕獲這個異常。這個郵件是有問題的,如果不刪除,下次出來還是會拋異常,于是我們給他置一個刪除標志。

          5:將已處理的郵件置刪除標志。很奇怪,置刪除標志的郵件不是被放在了垃圾箱里,而是被徹底刪除了,所以用的時候要小心。但是如果繼續留在收件箱,下次又會被處理一次

          6:當前面的郵件解析操作正常結束的時候,folder.close(true)會執行。這個時候,才會將剛剛置了刪除標志的郵件刪除。前面說過異常如果沒有被捕獲會出問題。這個問題就是,前面的郵件已經處理了,并且置上了刪除標志,但是碰到問題郵件的時候拋出異常,沒有被及時捕獲,于是folder.close(true)不會被執行,那些該刪除的郵件就沒有刪除。那么當你再調用這個connectMail的時候就會重復的處理郵件。我是在servlet里寫的定時器來調用這個函數的,當時出問題,于是有的郵件被重復解析了200多次,這是很可怕的數字。

          7:活兒干完了,要關閉連接。

          解析郵件:
          private static void displayPart(Part part)
                  
          throws Exception
              
          {

                  String sct 
          = part.getContentType();
                  
          if (sct == null)
                  
          {
                      
          return;                                                            1
                  }

                  ContentType ct 
          = new ContentType(sct);

                  
          if(ct.getBaseType().equals("image/gif"|| ct.getBaseType().equals("image/jpeg"|| ct.getBaseType().equals("image/pjpeg") )                                            2
                  
          {
                      
          // generate a url for this part
                      String s;
                      
          if ((s = part.getFileName()) != null)
                      
          {
                          s 
          = MimeUtility.decodeText(s);                                    3
                      }


                      String strType 
          =  s.substring(s.lastIndexOf("."));
                      InputStream is 
          = part.getInputStream();

                      
          if(strType.equals(".gif")||strType.equals(".jpg"))                            4
                      
          {
                          
          do your business here!!!
                          is.close();                                                        
          5
                      }

                  }
                                                                              6
              }


          1part.getContentType()說明取不到這個message的類型,直接返回,不需處理

          2:根據我的需求,我只需處理圖片類型,也就是說,只要這3種類型的message,其他的都可以忽略

          3email是遵循一些編碼方式的,大部分用的是base64,但是java mail提供解碼的工具,這就是MimeUtility.decodeText(s)

          4:再對文件類型做一次判斷(其實我覺得是不需要的,但是嚴整完整一點還是好些)

          5:有的操作系統對InputStram這樣的對象有限制,限制同時打開的InputStream個數,例如linux中就有這樣的限制。所以在打開了一個InputStream最好關閉。當然,如果不關閉,java的自動回收功能也回回收這個InputStream

          6:其實有的郵件的附件也是multipart/*類型的,這時應該再調用displayPart,這是這個函數的缺陷,所有注2if應該再加一個else if調用displayPart邏輯上才是正確的
          posted on 2005-11-27 12:50 hopeshared 閱讀(598) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 德昌县| 虞城县| 富平县| 巫山县| 铜山县| 宜城市| 合山市| 宁波市| 呈贡县| 辽宁省| 长阳| 城固县| 博白县| 承德市| 宝鸡市| 勃利县| 毕节市| 漳州市| 台山市| 达日县| 清苑县| 灵宝市| 达尔| 容城县| 黄浦区| 盐城市| 泰和县| 浦东新区| 云梦县| 资兴市| 望谟县| 蒙山县| 龙州县| 潜山县| 桦南县| 景宁| 东兴市| 信丰县| 正宁县| 慈利县| 定州市|