Download attachments using Exchange Web Services Java API?

こ雲淡風輕ζ 提交于 2019-12-05 05:56:57

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

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

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

Honestly as painful as it is, I'd use the PROXY version instead of the Managed API. It's a pity, but the managed version for java seems riddled with bugs.

before checking for item.getHasAttachments(), you should do item.load(). Otherwise there is a chance 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());
        }
    }
}

Little late for the 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'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());
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!