精彩的人生

          好好工作,好好生活

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

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

           

          說明:這是我的在工作中寫的代碼,是可用的。但是有部分代碼被截取出來,比如有些參數(shù)我覺得沒有必要,就刪除了,沒有測試。可能會(huì)有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);//設(shè)置權(quán)限為讀寫

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

                  
          //一次處理9個(gè)郵件
                  for(int i=1;i<(msgNum>10?10:msgNum+1);i++)                            2
                  
          {
                      
          try    
                      
          {
                          
          //循環(huán)解析郵件
                          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;
                      }


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

                  }


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

            }


          1:使用的協(xié)議是pop3,因?yàn)檫@里不需要發(fā)送郵件,只度讀取郵件,pop3協(xié)議比較簡單方便

          2:這個(gè)函數(shù)沒有一次處理所有的郵件,因?yàn)闆]有這個(gè)必要。如果需要一次處理所有郵件的話,將for循環(huán)的那部分刪除就可以了

          3message的類型可以是text/plain,text/html或者是multipart/*等類型的。但是只有multipart/*才是有附件的郵件。當(dāng)然,有的郵件系統(tǒng)是將郵件內(nèi)容作為附件來傳遞的。

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

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

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

          7:活兒干完了,要關(guān)閉連接。

          解析郵件:
          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()說明取不到這個(gè)message的類型,直接返回,不需處理

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

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

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

          5:有的操作系統(tǒng)對InputStram這樣的對象有限制,限制同時(shí)打開的InputStream個(gè)數(shù),例如linux中就有這樣的限制。所以在打開了一個(gè)InputStream最好關(guān)閉。當(dāng)然,如果不關(guān)閉,java的自動(dòng)回收功能也回回收這個(gè)InputStream

          6:其實(shí)有的郵件的附件也是multipart/*類型的,這時(shí)應(yīng)該再調(diào)用displayPart,這是這個(gè)函數(shù)的缺陷,所有注2if應(yīng)該再加一個(gè)else if調(diào)用displayPart邏輯上才是正確的
          posted on 2005-11-27 12:50 hopeshared 閱讀(602) 評(píng)論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 东乌| 土默特右旗| 绵竹市| 五峰| 陆河县| 奇台县| 开封市| 济阳县| 县级市| 南郑县| 河曲县| 娱乐| 仁布县| 丰顺县| 南靖县| 神农架林区| 西乌珠穆沁旗| 凤城市| 永春县| 涿鹿县| 壤塘县| 南召县| 精河县| 全南县| 赤水市| 杨浦区| 始兴县| 奎屯市| 西乌珠穆沁旗| 张家川| 北票市| 闽侯县| 靖安县| 宜州市| 伊宁市| 临洮县| 镇雄县| 泸州市| 固始县| 诏安县| 东乌珠穆沁旗|