0

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

在 POP3 中,如果我想获取某个邮件的内容,javamail 会下载邮件的所有内容,包括附件。如果附件足够大,android程序会抛出oom异常。但我在 IMAP 协议中尝试过,它只先获取内容的骨架,即使有一些大附件,它也能正常工作。

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

以下代码适用于 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());
    }
}
4

2 回答 2

0

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

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

POP3s 基本协议只支持下载整个消息。使用可选的 TOP 扩展,它将允许您下载n消息的第一行。

如果 JavaMail 具有将消息下载流式传输到磁盘(而不是全部在内存中)的特定扩展,那应该可以让您绕过 Out Of Memory 错误。

于 2012-08-07T15:02:07.960 回答
0

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

于 2012-08-07T17:26:41.263 回答