我正在尝试使用 javax.mail API 开发 IMAP 电子邮件客户端。我已经能够毫无问题地联系服务器、获取电子邮件、附件和其他操作。
但是,在用户想要显式查看附件以提高性能之前,我们不希望获取附件。这意味着我们需要指示电子邮件是否有附件的信息,如果有,则需要文件名和大小,但不会向我发送电子邮件的实际内容。但是,我无法在 API 描述中找到只返回多部分内容的方法。
有没有办法只获取附件的正文和详细信息,而不是实际的附件?
谢谢,阿拉文德
我正在尝试使用 javax.mail API 开发 IMAP 电子邮件客户端。我已经能够毫无问题地联系服务器、获取电子邮件、附件和其他操作。
但是,在用户想要显式查看附件以提高性能之前,我们不希望获取附件。这意味着我们需要指示电子邮件是否有附件的信息,如果有,则需要文件名和大小,但不会向我发送电子邮件的实际内容。但是,我无法在 API 描述中找到只返回多部分内容的方法。
有没有办法只获取附件的正文和详细信息,而不是实际的附件?
谢谢,阿拉文德
退货getContent()
方式_javax.Part
内容作为 Java 对象。返回对象的类型当然取决于内容本身。例如,为“text/plain”内容返回的对象通常是一个字符串对象。为“多部分”内容返回的对象始终是多部分子类。
请参阅http://download.oracle.com/javaee/6/api/javax/mail/Part.html#getContent%28%29
如果 a Message
(即 a Part
)包含附件,则 getContent 方法将返回一个Multipart
对象。此外,您还可以通过 了解零件的 MIME 类型getContentType
。
文档中缺少的信息是MultiPart
返回的这个对象getContent
只是消息结构的空表示。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/邮件/FetchProfile.Item.html#CONTENT_INFO)。如果没有,每个
Multipart mp = (Multipart)p.getContent();
将导致向服务器请求获取正文结构。如果使用该FetchProfile
方法,则只需要一个请求即可获取消息集合的主体结构。如果您在会话上激活调试模式,您可以在日志中看到对服务器的请求:
session.setDebug(true);
这就是说,要获取附件的大小和文件名,只需分别使用Part.getSize()
和Part.getFileName()
。