更新Office365个人通讯录

时间:2017-07-25 12:39:43

标签: office365 microsoft-graph office365api

上下文:

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

  • Coordinator1管理409个人联系人。
  • Coordinator2管理216个个人联系人。
  • 等等...

我们有一个夜间任务,填充SQL Server 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这些12个协调员。

提前致谢。

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

2 个答案:

答案 0 :(得分:0)

目前,Microsoft GraphOutlook REST API都不支持“联系人群组”。

但您可以使用EWS Managed API以编程方式创建它们。在How to: Create contact groups by using EWS in Exchange中有一个示例C#代码的演练。

答案 1 :(得分:0)

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

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;
    }
}