2010-11-18 115 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()會返回一個對象,但是如果您知道該內容類型,則可以對其進行適當的轉換(例如,將其轉換爲文本字符串)。