【问题标题】:Fetch attachment content using javamail使用 javamail 获取附件内容
【发布时间】:2010-11-19 16:05:39
【问题描述】:

我正在使用 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;
}

该功能运行良好(即:仅当部分是文件名描述的附件时才返回内容)。但是它的返回数组太大了。

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

我认为问题出在标题上,但我不能确定。

您将如何继续仅获取内容?

谢谢。

【问题讨论】:

  • 太大了是什么意思?它会创建指定的文件吗?如果是,那怎么会太大
  • 如果我在桌面上下载附件并检查大小,我会得到 256 字节。但是对于同一个附件,当我运行这段代码时,返回的数组是 352 字节长。

标签: java jakarta-mail


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我终于找到了解决办法。

    正如 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 2023-03-03
      • 1970-01-01
      • 2013-04-05
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 2013-12-23
      相关资源
      最近更新 更多