IMAP - javax.mail。 - 只获取没有附件的身体

时间:2009-12-17 14:00:09

标签: imap attachment javax.mail

我正在尝试使用javax.mail API开发IMAP电子邮件客户端。我已经能够毫无问题地联系服务器,获取电子邮件,附件和其他操作。

但是,我们不希望在用户想要查看explit之前获取附件以提高性能。这意味着我们需要的信息表明电子邮件是否有附件,如果是,那么文件名和大小,但向我发送实际内容电子邮件。但是,我无法在API描述中找到只返回多部分内容的方法。

有没有办法可以获取身体和附件的细节而不是实际的附件?

谢谢, 阿拉汶

1 个答案:

答案 0 :(得分:2)

getContent()的方法javax.Part返回

  

将内容作为Java对象。类型   返回的对象当然是   取决于内容本身。对于   例如,返回的对象   “text / plain”内容通常是一个   字符串对象。返回的对象   “多部分”内容始终是一个   多部分子类。

请参阅http://download.oracle.com/javaee/6/api/javax/mail/Part.html#getContent%28%29

如果MessagePart)包含附件,则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()