使用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); } }