我正在尝试使用javax.mail API开发IMAP电子邮件客户端。我已经能够毫无问题地联系服务器,获取电子邮件,附件和其他操作。
但是,我们不希望在用户想要查看explit之前获取附件以提高性能。这意味着我们需要的信息表明电子邮件是否有附件,如果是,那么文件名和大小,但不向我发送实际内容电子邮件。但是,我无法在API描述中找到只返回多部分内容的方法。
有没有办法可以获取身体和附件的细节而不是实际的附件?
谢谢, 阿拉汶
答案 0 :(得分:2)
getContent()
的方法javax.Part
返回
将内容作为Java对象。类型 返回的对象当然是 取决于内容本身。对于 例如,返回的对象 “text / plain”内容通常是一个 字符串对象。返回的对象 “多部分”内容始终是一个 多部分子类。
请参阅http://download.oracle.com/javaee/6/api/javax/mail/Part.html#getContent%28%29
如果Message
(Part
)包含附件,则getContent方法将返回Multipart
个对象。此外,您可以使用getContentType
知道部件的MIME类型。
文档中缺少的信息是MultiPart
返回的getContent
对象只是Message结构的空表示。只有在您明确要求时才会从服务器获取Part
的每个Multipart
的内容。例如,要解析多部分Message
,您可以执行以下操作:
if( p.isMimeType("multipart/*") ) {
Multipart mp = (Multipart)p.getContent();
// the content was not fetched from the server
// parse each Part
for (int i = 0; i < mp.getCount(); i++) {
Part inner_part = mp.getBodyPart(i)
if( inner_part.isMimeType("text/plain") ) {
String text = inner_part.getText();
// the content of this Part was fetched from the server
}
}
}
要考虑的其他因素是,为了获得最佳性能,您应该批量获取服务器的正文结构信息,以便收集要解析的消息(请参阅http://download.oracle.com/javaee/6/api/javax/mail/FetchProfile.Item.html#CONTENT_INFO)。如果没有,每个
Multipart mp = (Multipart)p.getContent();
将导致向服务器请求获取正文结构。如果使用FetchProfile
方法,则仅使用一个请求获取消息集合的主体结构。如果在会话上激活调试模式,则可以在日志中看到对服务器的请求:
session.setDebug(true);
这就是说,要获取附件的大小和文件名,请分别使用Part.getSize()
和Part.getFileName()
。