6

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

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

有没有办法只获取附件的正文和详细信息,而不是实际的附件?

谢谢,阿拉文德

4

1 回答 1

2

退货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()

于 2011-01-12T14:01:45.710 回答