<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
    主站蜘蛛池模板: 美景之屋4在线未删减免费 | 亚洲无码日韩精品第一页| 国内精品久久久久影院亚洲| 91香蕉国产线观看免费全集| 色婷婷六月亚洲婷婷丁香| 久久青草免费91观看| 亚洲AV无码成人网站久久精品大| 中文字幕成人免费高清在线| 在线亚洲精品福利网址导航| 99视频在线免费观看| 色婷婷亚洲十月十月色天| 99久久99这里只有免费费精品| 91亚洲精品第一综合不卡播放| 成年人免费的视频| 日韩亚洲国产高清免费视频| 国产成人综合久久精品免费| 成人午夜免费视频| 国产亚洲综合一区柠檬导航| 亚洲精品国产精品国自产观看| 一区二区3区免费视频| 日本亚洲欧洲免费天堂午夜看片女人员| 999zyz**站免费毛片| 久久精品a亚洲国产v高清不卡| 黄页网站免费观看| 成人婷婷网色偷偷亚洲男人的天堂| 亚洲国产精品综合久久网络| 免费国产污网站在线观看| 亚洲国产中文在线二区三区免| 在线观看成人免费视频| 伊人久久国产免费观看视频| 亚洲国产人成在线观看69网站| 性xxxxx免费视频播放 | 亚洲av片不卡无码久久| 国产一级高清视频免费看| 中文字幕免费在线播放| 亚洲va在线va天堂va手机| 久久亚洲精品无码播放| 国产成人精品久久免费动漫| 免费播放国产性色生活片| 7777久久亚洲中文字幕蜜桃| 日本不卡高清中文字幕免费|