复制消息数组

时间:2012-05-17 08:08:27

标签: android arrays copy message javamail

我正在尝试从收件箱文件夹中复制邮件:

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

我这样做是因为,当我在收件箱中查看邮件时,所有最近的邮件都会成为“看到过的邮件”。其原因是getContent()方法。我想弄清楚如何将消息复制到另一个数组,并在源消息数组中处理它们。

但是当我尝试上面的复制过程时,我对源数组所做的任何更改也会在messages数组中发生变化。我的意思是如果我在源消息数组上调用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;
    }

1 个答案:

答案 0 :(得分:0)

您正在复制指向数组的指针,而不是复制邮件内容。你有两个层次的间接远离你想做的事情。

但是,复制邮件内容并不能解决您的问题。复制消息内容的过程将设置SEEN标志。您需要做的是在访问消息内容之前复制所有SEEN标志。

或者,您可以使用com.sun.mail.imap.IMAPMessage.setPeek() method使访问消息内容不设置SEEN标志。将Message对象强制转换为IMAPMessage以使用此方法。