更新 Office365 个人通讯录

Update Office365 personal Contacts

上下文:

我们公司有12名协调员。每个协调员管理一堆个人联系人。

我们有一个夜间任务,用于填充 SQL 服务器 TABLE 保存个人联系信息。

TABLE中的数据被提取到12个不同的CSV files中,依次发送给每个协调器。

协调员有责任将 导入 这个 CSV file 到他的 Outlook 中,以使他的个人联系人列表保持最新(是的,那些个人联系人每​​日更换)。

CSV 文件的整个导入 对于这些协调员中的大多数来说有点太多了,目标是自动执行此操作或拥有同步 Outlook 个人联系人的功能,以便这些协调员将不必执行此日常手动任务。

我尝试过的:

我创建了一个 C# 控制台应用程序并添加了 ADAL 和 Microsoft Graph 客户端库 NuGet 包。

我已经在 Azure 中正确注册了我的应用程序并获得了 Client IdClient Secret

我设置了合适的Application and Delegated permissions

我能够 运行 应用程序,获得 token 并调用 Microsoft Graph 客户端。

问题:

在撰写本文时,我的问题是 Microsoft Graph 不支持创建 Contact List,也不允许我在此 Contact List 中添加、删除或更新个人联系人。

无法使用 Groups。每次您将用户添加到群组时,都会向该特定用户发送一封电子邮件,让他知道他已被添加到群组中。

此外,同一用户可以将自己从组中删除,我们根本不希望这样。

Microsoft Graph 还支持创建 Folders 并将人员添加到这些文件夹,但不幸的是,我发现这些文件夹的唯一用途是组织内容...

使用文件夹,我无法将电子邮件发送到特定文件夹,而该文件夹又会向该文件夹中的每个人发送电子邮件。这就是 Contact List 的目的...但是,在撰写本文时,API 对 Contact List 没有任何作用。

有没有人有更好的建议或解决方法来完成我的任务?

我不介意重写整个控制台应用程序,甚至完全改变整个方法(比如使用 Powershell)

我唯一关心的是不要再手动 导入 一个 CSV file CSV file

提前致谢。

PS:我什至查看了 Microsoft Flow,但没有找到可以更新 Outlook 个人联系人的 Flow。

目前 Microsoft Graph nor the Outlook REST API 都不支持 "Contact Groups"。

但是您可以使用 EWS Managed API. There is a walkthrough with example C# code in How to: Create contact groups by using EWS in Exchange 以编程方式创建它们。

如果有人关心的话,这是最终结果...

static void Main(string[] args)
{
    try
    {
        var domain = "mydomain.com";
        var email = "service_account@mydomain.com";
        var accountPassword = "Password1";
        var emailToImpersonify = "frank_underwood@mydomain.com";
        var contactGroupDisplayName = "MySuperAmazingContactGroup";

        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
        service.Credentials = new NetworkCredential(email, accountPassword, domain);
        service.AutodiscoverUrl(email, RedirectionUrlValidationCallback);

        // Make sure the account [service_account@mydomain.com] is a member of the ApplicationImpersonation admin role. 
        service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, emailToImpersonify);

        // Prior to creating the ContactGroup, check and delete any pre-existing ContactGroup
        SearchFilter sfSearch = new SearchFilter.IsEqualTo(ContactGroupSchema.DisplayName, contactGroupDisplayName);
        FindItemsResults<Item> results = service.FindItems(WellKnownFolderName.Contacts, sfSearch, new ItemView(int.MaxValue));
        if (results != null)
        {
            foreach (Item item in results)
                item.Delete(DeleteMode.HardDelete);
        }

        // Create the new ContactGroup with a few members
        ContactGroup newContactGroup = new ContactGroup(service);
        newContactGroup.DisplayName = contactGroupDisplayName;
        newContactGroup.Members.Add(new GroupMember("user1@contoso.com"));
        newContactGroup.Members.Add(new GroupMember("user2@contoso.com"));
        newContactGroup.Save();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}