2012-08-07 62 views
0

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

在POP3中,如果我想获取某个邮件的内容,那么javamail会下载邮件的所有内容,包括附件。如果附件足够大,android程序会抛出异常。但我尝试了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()); 
    } 
} 

回答

0

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

IMAP提供的方法,在它的协议下载MIME部分的消息,使得消息在服务器上除了挑选和下载的部分。

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

如果JavaMail具有特定的扩展来将消息下载到磁盘(而不是全部存储在内存中),那么应该允许您避开内存不足错误。

+0

Thx,它帮助我很多! :) – 2012-08-08 02:42:57

+0

太棒了。请考虑加注和/或接受答案。 – Max 2012-08-08 02:51:13

0

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