更新 Office365 个人通讯录
Update Office365 personal Contacts
上下文:
我们公司有12名协调员。每个协调员管理一堆个人联系人。
- Coordinator1 管理 409 个个人联系人。
- 协调员 2 管理 216 个个人联系人。
- 等等...
我们有一个夜间任务,用于填充 SQL 服务器 TABLE
保存个人联系信息。
TABLE
中的数据被提取到12个不同的CSV files
中,依次发送给每个协调器。
协调员有责任将 导入 这个 CSV file
到他的 Outlook 中,以使他的个人联系人列表保持最新(是的,那些个人联系人每日更换)。
CSV 文件的整个导入 对于这些协调员中的大多数来说有点太多了,目标是自动执行此操作或拥有同步 Outlook 个人联系人的功能,以便这些协调员将不必执行此日常手动任务。
我尝试过的:
我创建了一个 C# 控制台应用程序并添加了 ADAL 和 Microsoft Graph 客户端库 NuGet 包。
我已经在 Azure 中正确注册了我的应用程序并获得了 Client Id
和 Client 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;
}
}
上下文:
我们公司有12名协调员。每个协调员管理一堆个人联系人。
- Coordinator1 管理 409 个个人联系人。
- 协调员 2 管理 216 个个人联系人。
- 等等...
我们有一个夜间任务,用于填充 SQL 服务器 TABLE
保存个人联系信息。
TABLE
中的数据被提取到12个不同的CSV files
中,依次发送给每个协调器。
协调员有责任将 导入 这个 CSV file
到他的 Outlook 中,以使他的个人联系人列表保持最新(是的,那些个人联系人每日更换)。
CSV 文件的整个导入 对于这些协调员中的大多数来说有点太多了,目标是自动执行此操作或拥有同步 Outlook 个人联系人的功能,以便这些协调员将不必执行此日常手动任务。
我尝试过的:
我创建了一个 C# 控制台应用程序并添加了 ADAL 和 Microsoft Graph 客户端库 NuGet 包。
我已经在 Azure 中正确注册了我的应用程序并获得了 Client Id
和 Client 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;
}
}