使用javamail获取附件内容

时间:2010-11-18 20:47:21

标签: java javamail

我正在使用javamail自动执行某些电子邮件处理。

我设法获得与pop3服务器的连接并获取消息。其中一些包含附件。根据电子邮件标题,我能够“预测”我需要获取的附件的文件名。

但我无法得到它的内容:(

我有一个功能

public byte[] searchForContent(Part part,String fileName){
    if(part.getFileName()!=null){
        if(part.getFileName().equals(fileName)){
            byte[] content = new byte[part.getSize()];
            part.getInputStream().read(content);
            return content[]
        }
    }
    return null;
}

该功能非常有效(即:仅当部件是fileName描述的附件时才返回内容)。但是数组的回报太大了。

下载的附件长度为256个字节,函数返回352个字节的长内容。

我认为问题来自标题,但我无法确定。

您将如何继续获取内容?

谢谢。

2 个答案:

答案 0 :(得分:0)

对于它的价值,javax.mail.Part.getSize()的API文档说

  

请注意,大小可能不是内容大小的精确度量,可能会也可能不会考虑内容的任何传输编码。该尺寸适合在用户界面中显示,以便用户大致了解该部件的尺寸。

假设您知道内容的类型,您可以从Part.getContent()获取内容并进行处理。 getContent()返回一个Object,但如果您知道内容类型,则可以适当地将其强制转换(例如,转换为文本字符串)。

答案 1 :(得分:0)

我终于找到了解决方案。

正如eaj所说:part.getSize()返回零件对象的大小。不是附件本身的大小。

但是,part.getInputStream()返回的InputStream仅包含附件的内容。

所以下面的代码确实给出了预期的结果:

public byte[] searchForContent(Part part,String fileName){
    if(part.getFileName()!=null){
        if(part.getFileName().equals(fileName)){
            InputStream stream=part.getInputStream();

            byte[] buffer = new byte[512];
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            int bytesRead;
            while ((bytesRead = stream.read(buffer) != -1)
            {
                baos.write(buffer, 0, bytesRead);
            }
            return baos.toByteArray();
        }
    }
    return null;
}