Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 列出公用文件夹_Java_Outlook_Office365_Exchangewebservices - Fatal编程技术网

Java 列出公用文件夹

Java 列出公用文件夹,java,outlook,office365,exchangewebservices,Java,Outlook,Office365,Exchangewebservices,我正在编写一个程序,用于将联系人从ERP系统导入Outlook。不同的电子邮件将收到来自ERP的不同联系人列表。这里的想法是,在每封电子邮件中,我都有一个公共联系人文件夹,技术用户可以访问该文件夹。技术用户可以将联系人写入此文件夹。以下是搜索文件夹的代码: protected FolderId findFolderId(String folderDisplayName, String userEmail) throws Exception { Mailbox userMailbox =

我正在编写一个程序,用于将联系人从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而言是)


该代码适用于Office 2010,我从该文件夹中获取Id,连接到该文件夹并保存联系人。迁移到Office 365后,我们找不到公用文件夹。它可以找到一个名为“PeoplePublicData”的文件夹。(我甚至不知道该文件夹是否存在。)

在Office365中进行节流意味着您的代码将只返回邮箱中的前1000个文件夹,因此,如果您查找的内容不在该结果集中,这将是一个原因。我建议你扔掉它

FolderView视图=新FolderView(整数.MAX_值)

并将其更改为

FolderView视图=新FolderView(1000)

然后对结果进行分页,这将允许您获取邮箱中的所有文件夹。此外,除非您正在邮箱的非IPM_子树中查找某些内容,否则请使用MsgFolderRoot等启动搜索

FolderId contactRootFolder=新的FolderId(WellKnownFolderName.MsgFolderRoot,userMailbox)

这将减少返回的文件夹数


另外,您为什么不使用SearchFilter来搜索您要查找的文件夹呢?例如,这样就无需翻页搜索结果了。

Hi Glen,感谢SearchFilter的建议。我将更改代码。更改为WellKnowFolderName.MsgFolderRoot后,我在service.findFolders(…)发生的行中获得了例外:线程“main”中的异常microsoft.exchange.webservices.data.core.Exception.service.remote.ServiceResponseException:在存储中找不到指定的对象。,该进程无法获取正确的属性。听起来您似乎无权访问邮箱,例如,您可能在访问后有权访问该特定文件夹,但只有在您知道该文件夹的ewsId时才能访问该文件夹。除非您对邮箱的其余部分具有完全访问权限,否则您将无法搜索该文件夹。我们已找到解决方案。在Office 365中,联系人文件夹必须设置为对技术用户可见。那么这是否意味着office 365比office 2013更受限制?