<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    精彩的人生

    好好工作,好好生活

    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里講解?,F在,捕獲這個異常。這個郵件是有問題的,如果不刪除,下次出來還是會拋異常,于是我們給他置一個刪除標志。

    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 閱讀(595) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 免费一级毛片女人图片| 2021精品国产品免费观看| 国产伦精品一区二区三区免费迷| 亚洲综合色一区二区三区小说| 久久免费精彩视频| 婷婷亚洲综合五月天小说| 久久久精品免费视频| 亚洲AV日韩AV永久无码久久| 男女午夜24式免费视频| 亚洲尹人香蕉网在线视颅| 亚洲免费在线视频观看| 亚洲一级毛片免费观看| 成年女人免费碰碰视频| 极品色天使在线婷婷天堂亚洲| 亚洲成人在线网站| 99久久免费看国产精品| 亚洲国产精品成人综合久久久| 在线永久免费的视频草莓| 亚洲午夜无码毛片av久久京东热| 一个人免费视频观看在线www | 久久影院亚洲一区| 精品熟女少妇aⅴ免费久久| 亚洲综合av永久无码精品一区二区 | 国产免费变态视频网址网站| 男女猛烈无遮掩视频免费软件| 国产精品亚洲视频| 久久99国产综合精品免费| 2020亚洲男人天堂精品| 国产免费观看网站| a成人毛片免费观看| 亚洲成a人片7777| 午夜国产羞羞视频免费网站| a级毛片高清免费视频| 亚洲视频日韩视频| 全黄大全大色全免费大片| 亚洲蜜芽在线精品一区| 日韩a级毛片免费观看| 国产日韩AV免费无码一区二区| 亚洲综合久久一本伊伊区| 亚洲国产一级在线观看 | 亚洲AV女人18毛片水真多|