列出公用文件夹

时间:2017-04-12 13:35:39

标签: java outlook office365 exchangewebservices

我正在编写一个程序,用于将联系人从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"的文件夹。 (我甚至不知道该文件夹存在。)

1 个答案:

答案 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,这样就无需分页结果,