9

我正在编写一个 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

4

5 回答 5

8

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

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

于 2011-07-08T11:34:02.533 回答
4
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());
      } 
   } 
} 
于 2012-09-18T04:58:32.183 回答
1

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

于 2011-07-05T19:32:37.393 回答
0

在检查 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());
        }
    }
}
于 2014-02-14T07:12:22.950 回答
0

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

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());
    }
于 2017-04-12T15:16:21.110 回答