【问题标题】:Download attachments using Exchange Web Services Java API?使用 Exchange Web 服务 Java API 下载附件?
【发布时间】:2011-07-05 16:41:26
【问题描述】:

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

我能够获取电子邮件标题。但是,我无法使用此 API 下载电子邮件附件。下面是代码sn-p。

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

【问题讨论】:

    标签: java exchange-server exchangewebservices ewsjavaapi


    【解决方案1】:

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

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

    【讨论】:

    • @grapkulec 你能提供一个简单的例子吗?你会非常好。
    【解决方案2】:
    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());
          } 
       } 
    } 
    

    【讨论】:

    • 虽然您的答案可能有效,但它可以使用一些评论来说明您的代码正在做什么,或者您对 OP 的代码所做的更改!
    • @Yury:如果我没看错的话,你确实添加了一行。考虑修剪代码并解释它的作用以及为什么需要它
    【解决方案3】:

    老实说,虽然很痛苦,但我会使用 PROXY 版本而不是托管 API。很遗憾,但是 java 的托管版本似乎充满了错误。

    【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 当我打电话给load() 我得到microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException: The request failed. ParseError at [row,col]:[93,9101] Message: Character reference "&amp;#
    • @Black - 这是因为附件可能是在正文或主题行中有一些特殊字符的项目附件。这是一个已知问题。 github.com/OfficeDev/ews-java-api/issues/440
    • 这个问题不是让 EWS api 完全不可行吗?
    • 我在此处的补丁中找到了解决方案:github.com/RavnSystems/ews-java-api/commit/…
    【解决方案5】:

    答案有点晚了,但这就是我所拥有的。

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

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多