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

Ara*_*ind 6 imap attachment javax.mail

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

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

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

谢谢,阿拉文德

Pau*_*nto 2

getContent()退货方式javax.Part

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

请参阅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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

其他需要考虑的事情是,为了获得最佳性能,您应该从服务器批量获取主体结构信息,以收集要解析的消息(请参阅http://download.oracle.com/javaee/6/api/javax/邮件/FetchProfile.Item.html#CONTENT_INFO)。如果没有,则每个

Multipart mp = (Multipart)p.getContent();

将导致向服务器发出请求以获取主体结构。如果FetchProfile使用该方法,则只需一个请求即可获取消息集合的主体结构。如果在会话上激活调试模式,您可以在日志中看到对服务器的请求:

session.setDebug(true);
Run Code Online (Sandbox Code Playgroud)

也就是说,要获取附件的大小和文件名,只需分别使用Part.getSize()Part.getFileName()