2013-02-15 68 views
0

最近我通過oracle-javamail從我的電子郵件下載CSV時遇到了問題。我發現第一個可以正常工作(來自大型機服務器),但是第二個csv附件看起來像是「application/vnd.ms-excel」,當它明顯是一個.csv文件就像另一個文件下載完全正常。oracle-javamail csv附件下載

我在他們兩個上都使用了相同的代碼,並且在這個問題上找不到任何信息。

如果我轉發給我自己的電子郵件,我可以神奇地下載附件沒有任何問題。任何幫助,將不勝感激。一旦我得到這個工作,另一個日常任務就自動完成

if(content instanceof java.lang.String){ 
    //emailBody = (String)content; 
} else if(content instanceof Multipart){ 
    System.out.println("is Multipart"); 
    Multipart mp = (Multipart)content; 
    for (int j=0; j < mp.getCount(); j++) { 
     Part part = mp.getBodyPart(j); 
     String disposition = part.getDisposition(); 
     if (disposition == null) { 
      // Check if plain 
      MimeBodyPart mbp = (MimeBodyPart)part; 
      if (mbp.isMimeType("text/plain")) {        
       //emailBody += (String)mbp.getContent(); 
      } else {        
       // Special non-attachment cases here of 
       // image/gif, text/html, ...         
       String fileName = decodeName(part.getFileName()); 
       File savedir = new File(path+"\\"+fileName); 
       saveFile(savedir, part);         
      } 
     } else if ((disposition != null) && 
       (disposition.equals(Part.ATTACHMENT) || disposition.equals(Part.INLINE))){ 
       // Check if plain 
       MimeBodyPart mbp = (MimeBodyPart)part; 
       if (mbp.isMimeType("text/plain")) {        
        System.out.println("has disp of plain"); 
        //emailBody += (String)mbp.getContent(); 
       } else {        
        System.out.println("has disp of else"); 
        String fileName = decodeName(part.getFileName()); 
        File savedir = new File(path+"\\"+fileName); 
        saveFile(savedir, part);      
       } 
     } 
    } 
} 
else{ 
    System.out.println(message.getContentType()); 
} 

回答

0

儘管看起來java知道它接收的是什麼類型的電子郵件,但事實證明它沒有。由於這不是標準類型,因此它會將其作爲輸入流返回。我可以用下面的代碼看到文件的內容。

另請注意,這僅作爲應用程序/ vnd.ms-excel文件類型的唯一原因是因爲電子郵件的正文爲空。

 InputStream emailIn = (InputStream) message.getContent(); 
    Scanner s = null; 
    try{ 
     s = new Scanner(emailIn).useDelimiter("\\A"); 
    while(s.hasNext()) 
     System.out.println(s.next()); 
    } 
    finally{ 
     s.close(); 
    }