使用Exchange Web服务Java API下载附件?

我正在编写一个Java应用程序来使用Exchange Web服务下载电子邮件。 我正在使用Microsoft的ewsjava API来执行此操作。

我可以获取电子邮件标题。 但是,我无法使用此API下载电子邮件附件。 以下是代码段。

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()返回true ,但attachmentsCol.getCount()0

您需要先加载属性Attachments然后才能在代码中使用它们。 您为传递给FindItems方法的ItemView对象设置它。

或者您可以先找到项目然后调用service.LoadPropertiesForItems并使用添加的EmailMessageSchema.Attachments传递findIesultsPropertySet对象

 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()); } } } 

老实说,我会使用PROXY版本而不是Managed API。 遗憾的是,java的托管版本似乎充满了bug。

在检查item.getHasAttachments()之前,你应该做item.load()。 否则,您的代码可能无法加载附件,attachmentsCol.getCount()将为0.使用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 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()); } } } 

回答有点迟,但这就是我所拥有的。

 HashMap> attachments = new HashMap>(); 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's 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()); }