我正在编写一个程序,用于将联系人从ERP系统导入Outlook。不同的电子邮件将从ERP接收不同的联系人列表。这里的想法是,在每封电子邮件中,我都有一个可以由技术用户访问的公共联系人文件夹。技术用户可以将联系人写入此文件夹。以下是搜索文件夹的代码:
protected FolderId findFolderId(String folderDisplayName, String userEmail) throws Exception {
Mailbox userMailbox = new Mailbox(userEmail);
FolderId contactRootFolder = new FolderId(WellKnownFolderName.Root, userMailbox);
FolderId result = null;
FolderView view = new FolderView(Integer.MAX_VALUE);
view.setPropertySet(new PropertySet(BasePropertySet.IdOnly, FolderSchema.DisplayName));
view.setTraversal(FolderTraversal.Deep);
FindFoldersResults findFolderResults = this.service.findFolders(contactRootFolder, view);
//find specific folder
for (Folder f : findFolderResults) {
if (folderDisplayName.equals(f.getDisplayName())) {
result = f.getId();
}
}
return result;
}
服务对象创建如下:
this.service = new ExchangeService();
ExchangeCredentials credentials = new WebCredentials(userName, passWord);
this.service.setCredentials(credentials);
try {
this.service.setUrl(new URI(URL));
} catch (URISyntaxException e) {
LOGGER.error(e);
}
其中URL是Exchange服务器的终点(对于Office 365,它是https://outlook.office365.com/EWS/Exchange.asmx)。
该代码适用于Office 2010,我从该文件夹获取Id,连接到它并保存联系人。迁移到Office 365后,我们无法找到公用文件夹。它只能找到一个名为" PeoplePublicData"的文件夹。 (我甚至不知道该文件夹存在。)
答案 0 :(得分:1)
Office365中的限制意味着您的代码只返回邮箱中的前1000个文件夹,因此如果您在该结果集中查找的内容不是一个原因。我建议你摆脱
FolderView view = new FolderView(Integer.MAX_VALUE);
并将其更改为
FolderView view = new FolderView(1000);
然后分页结果https://msdn.microsoft.com/en-us/library/office/dn592093(v=exchg.150).aspx,这将允许您获取邮箱中的所有文件夹。另外,除非您在邮箱的Non_IPM_Subtree中查找某些内容,否则请使用MsgFolderRoot开始搜索,例如
FolderId contactRootFolder = new FolderId(WellKnownFolderName.MsgFolderRoot,userMailbox);
这将减少返回的文件夹数量。
另外,为什么不使用SearchFilter搜索您所追求的文件夹,例如https://msdn.microsoft.com/en-us/library/office/dd633627(v=exchg.80).aspx,这样就无需分页结果,