是否使用Exchange Web服务Java API下载附件?
我正在编写一个Java应用程序,使用ExchangeWeb服务下载电子邮件。我正在使用微软的ewsjava API来做这件事 我能够获取电子邮件标题。但是,我无法使用此API下载电子邮件附件。下面是代码片段是否使用Exchange Web服务Java API下载附件?,java,exchange-server,exchangewebservices,ewsjavaapi,Java,Exchange Server,Exchangewebservices,Ewsjavaapi,我正在编写一个Java应用程序,使用ExchangeWeb服务下载电子邮件。我正在使用微软的ewsjava API来做这件事 我能够获取电子邮件标题。但是,我无法使用此API下载电子邮件附件。下面是代码片段 FolderId folderId = new FolderId(WellKnownFolderName.Inbox, "mailbox@example.com"); findResults = service.findItems(folderId, view); for(Item item
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;
}
}
}
FolderId FolderId=新的FolderId(WellKnownFolderName.Inbox,“mailbox@example.com");
findResults=service.findItems(folderId,视图);
对于(项:findResults.getItems()){
if(item.getHasAttachments()){
AttachmentCollection attachmentsCol=item.getAttachments();
System.out.println(attachmentsCol.getCount());//这一直在打印零。我的邮件有一个附件。
对于(int i=0;i
item.getHasAttachments()
正在返回true
,但是attachmentsCol.getCount()
是0
,老实说,我会使用代理版本而不是托管API。遗憾的是,java的托管版本似乎充满了bug。您需要加载属性附件,然后才能在代码中使用它们。为传递给FindItems方法的ItemView
对象设置它
或者,您可以先查找项目,然后调用服务。加载项目的属性
,并通过添加的EmailMessageSchema.Attachments
FolderId=new FolderId(WellKnownFolderName.Inbox)传递FindResults
和PropertySet
对象mailbox@example.com");
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());
}
}
}
findResults=service.findItems(folderId,视图);
loadPropertiesForItems(findResults、新PropertySet(BasePropertySet.FirstClassProperties、EmailMessageSchema.Attachments));
对于(项:findResults.getItems()){
如果(item.getHasAttachments()){
AttachmentCollection attachmentsCol=item.getAttachments();
System.out.println(attachmentsCol.getCount());
对于(inti=0;i
在检查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());
}
}
}
ItemView=newitemview(Integer.MAX_值);
view.getOrderBy().add(ItemSchema.DateTimeReceived,SortDirection.Descending);
FindItemsResults- results=service.findItems(WellKnownFolderName.Inbox,新的SearchFilter.IsEqualTo(EmailMessageSchema.IsRead,true),视图);
迭代器itr=results.Iterator();
while(itr.hasNext()){
Item=itr.next();
item.load();
ItemId ItemId=item.getId();
EmailMessage email=EmailMessage.bind(服务,项目ID);
如果(item.getHasAttachments()){
System.err.println(item.getAttachments());
AttachmentCollection attachmentsCol=item.getAttachments();
对于(int i=0;i
回答有点晚了,但以下是我的答案
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());
}
HashMap attachments=newhashmap();
如果(emailMessage.getHasAttachments()| | emailMessage.getAttachments().getItems().size()>0){
//获取所有附件
AttachmentCollection attachmentsCol=emailMessage.getAttachments();
log.info(“文件计数:+attachmentsCol.getCount());
//在附件上循环
对于(int i=0;i0){
//检查尺寸
int attachmentSize=attachmentContent.length;
//检查附件是否有效
ValidateEmail.validateAttachment(文件附件、属性、,
emailIdentifier,attachmentSize);
fileAttachments.put(UtilConstants.ATTACHMENT_SIZE,String.valueOf(attachmentSize));
//获取附件名称
String fileName=fileAttachment.getName();
fileAttachments.put(UtilConstants.ATTACHMENT\u名称、文件名);
字符串mimeType=fileAttachment.getContentType();
fileAttachments.put(UtilConstants.ATTACHMENT\u MIME\u TYPE,mimeType);
log.info(“文件名:“+fileName+”文件大小: