Download attachments using the Java Exchange Web Services API?

I am writing a Java application to download emails using Exchange Web Services. I am using the Microsoft ewsjava API for this.

I can get email headers. But I can not download email attachments using this API. The following is a snippet of code.

FolderId folderId = new FolderId(WellKnownFolderName.Inbox, " mailbox@example.com "); findResults = service.findItems(folderId, view); for(Item item : findResults.getItems()) { if (item.getHasAttachments()) { AttachmentCollection attachmentsCol = item.getAttachments(); System.out.println(attachmentsCol.getCount()); // This is printing zero all the time. My message has one attachment. for (int i = 0; i < attachmentsCol.getCount(); i++) { FileAttachment attachment = (FileAttachment)attachmentsCol.getPropertyAtIndex(i); String name = attachment.getFileName(); int size = attachment.getContent().length; } } } 

item.getHasAttachments() returns true , but attachmentsCol.getCount() is 0 .

+6
source share
5 answers

You need to load the Attachments property before you can use them in your code. You set it for the ItemView object that you pass to the FindItems method.

Or you can find the elements first and then call service.LoadPropertiesForItems and pass the findIesults and PropertySet object with the added EmailMessageSchema.Attachments

+5
source
 FolderId folderId = new FolderId(WellKnownFolderName.Inbox, " mailbox@example.com "); findResults = service.findItems(folderId, view); service.loadPropertiesForItems(findResults, new PropertySet(BasePropertySet.FirstClassProperties, EmailMessageSchema.Attachments)); for(Item item : findResults.getItems()) { if (item.getHasAttachments()) { AttachmentCollection attachmentsCol = item.getAttachments(); System.out.println(attachmentsCol.getCount()); for (int i = 0; i < attachmentsCol.getCount(); i++) { FileAttachment attachment = (FileAttachment)attachmentsCol.getPropertyAtIndex(i); attachment.load(attachment.getName()); } } } 
+2
source

Honestly, it hurts so much, I would use the PROXY version instead of the managed API. Sorry, but the managed version for java seems riddled with bugs.

+1
source

before checking item.getHasAttachments (), you must do item.load (). Otherwise, it is likely that your code will not load the attachment, and attachmentsCol.getCount () will be 0. Working code with Exchange Server 2010:

 ItemView view = new ItemView(Integer.MAX_VALUE); view.getOrderBy().add(ItemSchema.DateTimeReceived, SortDirection.Descending); FindItemsResults < Item > results = service.findItems(WellKnownFolderName.Inbox, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, true), view); Iterator<Item> itr = results.iterator(); while(itr.hasNext()) { Item item = itr.next(); item.load(); ItemId itemId = item.getId(); EmailMessage email = EmailMessage.bind(service, itemId); if (item.getHasAttachments()) { System.err.println(item.getAttachments()); AttachmentCollection attachmentsCol = item.getAttachments(); for (int i = 0; i < attachmentsCol.getCount(); i++) { FileAttachment attachment=(FileAttachment)attachmentsCol.getPropertyAtIndex(i); attachment.load("C:\\TEMP\\" +attachment.getName()); } } } 
0
source

A bit late for an answer, but here is what I have.

 HashMap<String, HashMap<String, String>> attachments = new HashMap<String, HashMap<String, String>>(); if (emailMessage.getHasAttachments() || emailMessage.getAttachments().getItems().size() > 0) { //get all the attachments AttachmentCollection attachmentsCol = emailMessage.getAttachments(); log.info("File Count: " +attachmentsCol.getCount()); //loop over the attachments for (int i = 0; i < attachmentsCol.getCount(); i++) { Attachment attachment = attachmentsCol.getPropertyAtIndex(i); //log.debug("Starting to process attachment "+ attachment.getName()); //FileAttachment - Represents a file that is attached to an email item if (attachment instanceof FileAttachment || attachment.getIsInline()) { attachments.putAll(extractFileAttachments(attachment, properties)); } else if (attachment instanceof ItemAttachment) { //ItemAttachment - Represents an Exchange item that is attached to another Exchange item. attachments.putAll(extractItemAttachments(service, attachment, properties, appendedBody)); } } } } else { log.debug("Email message does not have any attachments."); } //Extract File Attachments try { FileAttachment fileAttachment = (FileAttachment) attachment; // if we don't call this, the Content property may be null. fileAttachment.load(); //extract the attachment content, it not base64 encoded. attachmentContent = fileAttachment.getContent(); if (attachmentContent != null && attachmentContent.length > 0) { //check the size int attachmentSize = attachmentContent.length; //check if the attachment is valid ValidateEmail.validateAttachment(fileAttachment, properties, emailIdentifier, attachmentSize); fileAttachments.put(UtilConstants.ATTACHMENT_SIZE, String.valueOf(attachmentSize)); //get attachment name String fileName = fileAttachment.getName(); fileAttachments.put(UtilConstants.ATTACHMENT_NAME, fileName); String mimeType = fileAttachment.getContentType(); fileAttachments.put(UtilConstants.ATTACHMENT_MIME_TYPE, mimeType); log.info("File Name: " + fileName + " File Size: " + attachmentSize); if (attachmentContent != null && attachmentContent.length > 0) { //convert the content to base64 encoded string and add to the collection. String base64Encoded = UtilFunctions.encodeToBase64(attachmentContent); fileAttachments.put(UtilConstants.ATTACHMENT_CONTENT, base64Encoded); } //Extract Item Attachment try { ItemAttachment itemAttachment = (ItemAttachment) attachment; PropertySet propertySet = new PropertySet( BasePropertySet.FirstClassProperties, ItemSchema.Attachments, ItemSchema.Body, ItemSchema.Id, ItemSchema.DateTimeReceived, EmailMessageSchema.DateTimeReceived, EmailMessageSchema.Body); itemAttachment.load(); propertySet.setRequestedBodyType(BodyType.Text); Item item = itemAttachment.getItem(); eBody = appendItemBody(item, appendedBody.get(UtilConstants.BODY_CONTENT)); appendedBody.put(UtilConstants.BODY_CONTENT, eBody); /* * We need to check if Item attachment has further more * attachments like .msg attachment, which is an outlook email * as attachment. Yes, we can attach an email chain as * attachment and that email chain can have multiple * attachments. */ AttachmentCollection childAttachments = item.getAttachments(); //check if not empty collection. move on if (childAttachments != null && !childAttachments.getItems().isEmpty() && childAttachments.getCount() > 0) { for (Attachment childAttachment : childAttachments) { if (childAttachment instanceof FileAttachment) { itemAttachments.putAll(extractFileAttachments(childAttachment, properties, emailIdentifier)); } else if (childAttachment instanceof ItemAttachment) { itemAttachments = extractItemAttachments(service, childAttachment, properties, appendedBody, emailIdentifier); } } } } catch (Exception e) { throw new Exception("Exception while extracting Item Attachments: " + e.getMessage()); } 
0
source

Source: https://habr.com/ru/post/892058/


All Articles