我想使用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());
}
}
答案 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来处理大型附件。