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

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

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

    精彩的人生

    好好工作,好好生活

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

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

     

    說明:這是我的在工作中寫的代碼,是可用的。但是有部分代碼被截取出來,比如有些參數(shù)我覺得沒有必要,就刪除了,沒有測試。可能會有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個郵件
            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:這個函數(shù)沒有一次處理所有的郵件,因?yàn)闆]有這個必要。如果需要一次處理所有郵件的話,將for循環(huán)的那部分刪除就可以了

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

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

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

    6:當(dāng)前面的郵件解析操作正常結(jié)束的時(shí)候,folder.close(true)會執(zhí)行。這個時(shí)候,才會將剛剛置了刪除標(biāo)志的郵件刪除。前面說過異常如果沒有被捕獲會出問題。這個問題就是,前面的郵件已經(jīng)處理了,并且置上了刪除標(biāo)志,但是碰到問題郵件的時(shí)候拋出異常,沒有被及時(shí)捕獲,于是folder.close(true)不會被執(zhí)行,那些該刪除的郵件就沒有刪除。那么當(dāng)你再調(diào)用這個connectMail的時(shí)候就會重復(fù)的處理郵件。我是在servlet里寫的定時(shí)器來調(diào)用這個函數(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()說明取不到這個message的類型,直接返回,不需處理

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

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

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

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

    6:其實(shí)有的郵件的附件也是multipart/*類型的,這時(shí)應(yīng)該再調(diào)用displayPart,這是這個函數(shù)的缺陷,所有注2if應(yīng)該再加一個else if調(diào)用displayPart邏輯上才是正確的
    posted on 2005-11-27 12:50 hopeshared 閱讀(595) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 免费人成激情视频| 亚洲av无码专区亚洲av不卡| 免费大香伊蕉在人线国产| 日韩免费观看一区| 一级做α爱过程免费视频| 亚洲欧美日韩自偷自拍| 亚洲日韩国产精品无码av| 国产亚洲成AV人片在线观黄桃| 国产91在线免费| 青青草国产免费久久久91| 3344免费播放观看视频| 视频免费在线观看| 一区二区三区在线观看免费| 亚洲AV无码一区二区三区性色| 亚洲人成在线免费观看| 亚洲黄色片免费看| 亚洲一区二区在线免费观看| 亚洲精品无码久久久久| 国产亚洲老熟女视频| 亚洲国产成人精品久久久国产成人一区二区三区综| 欧美最猛性xxxxx免费| 台湾一级毛片永久免费| 亚洲一级毛片免费看| 2015日韩永久免费视频播放| 3344免费播放观看视频 | 国产做床爱无遮挡免费视频| 国产精品无码免费播放| 成人免费无码大片A毛片抽搐色欲| 无码区日韩特区永久免费系列| 欧洲一级毛片免费| 我们的2018在线观看免费高清| 最近2019年免费中文字幕高清| 精品一区二区三区无码免费视频 | 中文字幕久久亚洲一区| 久久久久无码专区亚洲av| 国产午夜亚洲不卡| 亚洲中文字幕不卡无码| 国产V亚洲V天堂无码| 亚洲自偷自偷精品| 亚洲国产综合在线| 亚洲色在线无码国产精品不卡|