2012-05-17 35 views
1

我試圖從收件箱文件夾複製郵件:複製消息數組

messages = folder.getMessages(); 
Message[] source = messages; 

我,因爲當我在收件箱中查看郵件,所有最新的消息成爲「看到消息」這樣做。原因是getContent()方法。我想知道如何將消息複製到另一個數組,並在源消息數組中處理它們。

但是當我嘗試像上面這樣的複製過程時,無論我對源數組所做的更改是否也在消息數組中發生更改。我的意思是如果我在源消息數組上調用getContent(),消息數組也會生效。

如何複製所有郵件並將其從文件夾中完全破解?

任何幫助,將不勝感激。

public Message[] ConnectionToServer(String email, String password) 
      throws Exception 
     { 
     Properties props = System.getProperties(); 
     props.setProperty("mail.imaps.partialfetch", "false"); 
     URLName server = new URLName("imaps://" + email + ":" + password + "@imap.gmail.com/INBOX"); 
     Session session = Session.getDefaultInstance(props, null); 
     folder = session.getFolder(server); 

     if (folder == null) 
     { 
      System.exit(0); 
     } 
     folder.open(Folder.READ_WRITE);  
     messages = folder.getMessages(); 

     for (int i = messages.length - 1; i >= 23; i--) 
     { 
      Part p = messages[i]; 

      subject = messages[i].getSubject(); 

      if (messages[i].isSet(Flags.Flag.RECENT)) { 
      isSet = true; 
      System.out.println("Recent"); 
      isSetlist.add(String.valueOf(isSet)); 
     } 
     if (messages[i].isSet(Flags.Flag.SEEN)) 
     { 
      isSet = false; 
      System.out.println("Read"); 
      isSetlist.add(String.valueOf(isSet)); 
     } 
     else 
     { 
      isSet = true; 
      System.out.println("Recent"); 
      isSetlist.add(String.valueOf(isSet)); 
     } 

      body = getText(p); 

      list.add(body); 
     } 
     return (Message[]) messages; 
    } 

和方法的getContent在我的getText()方法:

public String getText(Part p) throws MessagingException, IOException { 

     if (p.isMimeType("text/*")) { 
      boolean textIsHtml = false; 
      String s = (String) p.getContent(); 

      textIsHtml = p.isMimeType("text/html"); 
      return String.valueOf(s); 
     } 

     if (p.isMimeType("multipart/alternative")) { 
      // prefer html text over plain text 
      Multipart mp = (Multipart) p.getContent(); 
      String text = null; 
      for (int i = 0; i < mp.getCount(); i++) { 
       Part bp = mp.getBodyPart(i); 
       if (bp.isMimeType("text/plain")) { 
        if (text == null) 
         text = getText(bp); 
        continue; 
       } else if (bp.isMimeType("text/html")) { 
        String s = getText(bp); 
        if (s != null) 
         return String.valueOf(s); 
       } else { 
        return getText(bp); 
       } 
      } 
      return text; 
     } else if (p.isMimeType("multipart/*")) { 
      Multipart mp = (Multipart) p.getContent(); 
      for (int i = 0; i < mp.getCount(); i++) { 
       String s = getText(mp.getBodyPart(i)); 
       if (s != null) 
        return String.valueOf(s); 
      } 
     } 

     return null; 
    } 

回答

0

你複製指針數組,你不是複製郵件內容。你對你想做的事情有兩個層面的間接。

但是,複製郵件內容不會解決您的問題。複製郵件內容的過程將設置SEEN標誌。您需要做的是在訪問郵件內容之前製作所有SEEN標誌的副本。

或者,您可以使用com.sun.mail.imap.IMAPMessage.setPeek() method來訪問消息內容而不設置SEEN標誌。將Message對象轉換爲IMAPMessage以使用此方法。