使用Java Mail下载附件

现在我已经下载了所有的消息,并将其存储到

Message[] temp; 

如何获取每个消息的附件列表

 List<File> attachments; 

注意:请不要使用第三方库,只需要JavaMail。

没有exception处理,但这里有:

 List<File> attachments = new ArrayList<File>(); for (Message message : temp) { Multipart multipart = (Multipart) message.getContent(); // System.out.println(multipart.getCount()); for (int i = 0; i < multipart.getCount(); i++) { BodyPart bodyPart = multipart.getBodyPart(i); if(!Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition()) && !StringUtils.isNotBlank(bodyPart.getFileName())) { continue; // dealing with attachments only } InputStream is = bodyPart.getInputStream(); File f = new File("/tmp/" + bodyPart.getFileName()); FileOutputStream fos = new FileOutputStream(f); byte[] buf = new byte[4096]; int bytesRead; while((bytesRead = is.read(buf))!=-1) { fos.write(buf, 0, bytesRead); } fos.close(); attachments.add(f); } } 

问题很老,但也许会帮助别人。 我想扩大David Rabinowitz的答案。

 if(!Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())) 

你不应该像所期望的那样归还所有的事情,因为你可以有邮件的地方,没有定义的configuration。

  ----boundary_328630_1e15ac03-e817-4763-af99-d4b23cfdb600 Content-Type: application/octet-stream; name="00000000009661222736_236225959_20130731-7.txt" Content-Transfer-Encoding: base64 

所以在这种情况下,你也可以检查文件名。 喜欢:

 if (!Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition()) && !StringUtils.isNotBlank(part.getFileName())) {...} 

编辑

有上面所描述的使用条件的整个工作代码。因为每个部分可以封装另一个部分,嵌套应该嵌套,recursion用于遍历所有部分

 public List<InputStream> getAttachments(Message message) throws Exception { Object content = message.getContent(); if (content instanceof String) return null; if (content instanceof Multipart) { Multipart multipart = (Multipart) content; List<InputStream> result = new ArrayList<InputStream>(); for (int i = 0; i < multipart.getCount(); i++) { result.addAll(getAttachments(multipart.getBodyPart(i))); } return result; } return null; } private List<InputStream> getAttachments(BodyPart part) throws Exception { List<InputStream> result = new ArrayList<InputStream>(); Object content = part.getContent(); if (content instanceof InputStream || content instanceof String) { if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition()) || StringUtils.isNotBlank(part.getFileName())) { result.add(part.getInputStream()); return result; } else { return new ArrayList<InputStream>(); } } if (content instanceof Multipart) { Multipart multipart = (Multipart) content; for (int i = 0; i < multipart.getCount(); i++) { BodyPart bodyPart = multipart.getBodyPart(i); result.addAll(getAttachments(bodyPart)); } } return result; } 

保存附件文件的代码节省了一些时间:

用javax邮件版本1.4以后,可以这样说

 bodyPart.saveFile("/tmp/" + bodyPart.getFileName()); 

代替

  InputStream is = bodyPart.getInputStream(); File f = new File("/tmp/" + bodyPart.getFileName()); FileOutputStream fos = new FileOutputStream(f); byte[] buf = new byte[4096]; int bytesRead; while((bytesRead = is.read(buf))!=-1) { fos.write(buf, 0, bytesRead); } fos.close(); 

您可以简单地沿着Commons IO和Commons Lang使用Apache Commons Mail API MimeMessageParser – getAttachmentList() 。

 MimeMessageParser parser = .... parser.parse(); for(DataSource dataSource : parser.getAttachmentList()) { if (StringUtils.isNotBlank(dataSource.getName())) {} //use apache commons IOUtils to save attachments IOUtils.copy(dataSource.getInputStream(), ..dataSource.getName()...) } else { //handle how you would want attachments without file names //ex. mails within emails have no file name } } 

这是我的mefi的解决scheme的再现。

 private static void attachments( final BodyPart body, final BiConsumer<String, InputStream> consumer) throws MessagingException, IOException { final Multipart content; try { content = (Multipart) body.getContent(); for (int i = 0; i < content.getCount(); i++) { attachments(content.getBodyPart(i), consumer); } return; } catch (final ClassCastException cce) { } if (!Part.ATTACHMENT.equalsIgnoreCase(body.getDisposition())) { return; } final String name = body.getFileName(); if (name == null || name.trim().isEmpty()) { return; } try (final InputStream stream = body.getInputStream()) { consumer.accept(name, stream); } } public static void attachments( final Message message, final BiConsumer<String, InputStream> consumer) throws IOException, MessagingException { final Multipart content; try { content = (Multipart) message.getContent(); } catch (final ClassCastException cce) { return; } for (int i = 0; i < content.getCount(); i++) { attachments(content.getBodyPart(i), consumer); } }