Download attachments using Exchange Web Services J

2019-04-26 00:37发布

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

I am able to fetch email headers. But, I am not able to download email attachments using this API. Below is the code snippet.

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() is returning true, but attachmentsCol.getCount() is 0.

5条回答
ゆ 、 Hurt°
2楼-- · 2019-04-26 01:10
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());
      } 
   } 
} 
查看更多
淡お忘
3楼-- · 2019-04-26 01:11

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.

查看更多
地球回转人心会变
4楼-- · 2019-04-26 01:17

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

查看更多
三岁会撩人
5楼-- · 2019-04-26 01:21

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());
        }
    }
}
查看更多
对你真心纯属浪费
6楼-- · 2019-04-26 01:28

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());
    }
查看更多
登录 后发表回答