2010-11-18 47 views
3

我正在使用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个字节的内容。

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

您将如何继续获取内容?

谢谢。

+0

你是什么意思太大了?它会创建指定的文件吗?如果是这样,那么它怎么会太大 – 2010-11-18 21:27:01

+0

如果我在桌面上下载附件并检查大小,我会得到256个字节。但是对于相同的附件,当我运行此代码时,返回的数组长度为352个字节。 – almathie 2010-11-19 08:08:12

回答

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; 
} 
0

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

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

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