javamail fetch mail pop3 android

时间:2012-08-07 09:11:44

标签: android imap javamail pop3

我想使用javamail在android中获取电子邮件。 但我遇到了一些问题。

在POP3中,如果我想获取某个邮件的内容,javamail将下载邮件的所有内容,包括附件。如果附件足够大,android程序将抛出异​​常。但我试过IMAP协议,它只是首先获取内容的骨架,即使有一些大的附件,它也运行良好。

那么,当电子邮件中有大量附件时,如何使用pop3 protocal获取某个电子邮件的内容?

以下代码适用于imap,但不适用于pop3。

public void getContent(Part part) throws Exception {
    String contentType = part.getContentType();
    int nameindex = contentType.indexOf("name");
    boolean conname = false;
    if (nameindex != -1)
        conname = true;
    if (part.isMimeType("text/plain") && !conname) {
        bodytext.append((String) part.getContent());
    } else if (part.isMimeType("text/html") && !conname) {
        String html = (String) part.getContent();
        Spanned plainText = Html.fromHtml(html);
        bodytext.append(plainText);
    } else if (part.isMimeType("multipart/*")) {
        Multipart multipart = (Multipart) part.getContent();
        int counts = multipart.getCount();
        for (int i = 0; i < counts; i++) {
            BodyPart mpart = multipart.getBodyPart(i);
            Log.d("type,"," "+ i+mpart.getContentType());


            String disposition = mpart.getDisposition();
            if ((disposition != null)
                    && ((disposition.equals(Part.ATTACHMENT)) || (disposition
                            .equals(Part.INLINE))))
                continue;
            String contype = mpart.getContentType();
            if(contype.toLowerCase().indexOf("application")!=-1||contype.toLowerCase().indexOf("name")!=-1)
                continue;


            getContent(multipart.getBodyPart(i));
        }
    } else if (part.isMimeType("message/rfc822")) {
        getContent((Part) part.getContent());
    }
}

2 个答案:

答案 0 :(得分:0)

我不知道JavaMail的具体细节,但是:

IMAP提供了用于下载邮件的MIME部分的协议中的方法,允许在服务器上分离邮件并将其部分下载。

POP3s基本协议仅支持下载整个邮件。通过可选的TOP扩展,您可以下载消息的第一行n

如果JavaMail具有特定的扩展来将消息的下载流式传输到磁盘(而不是内存中的所有内容),那么应该可以解决内存不足的问题。

答案 1 :(得分:0)

JavaMail 1.4.4及更高版本可以将POP3消息缓存在磁盘上的tmp文件中,从而使用更少的内存。有关要设置的属性,请参阅javadocs for the com.sun.mail.pop3 package。您仍然需要小心处理邮件内容,例如,使用getInputStream而不是getContent来处理大型附件。