更新Office365个人联系人 背景:
我们公司有12名协调员。每个协调员管理一组个人联系人更新Office365个人联系人 背景:,office365,microsoft-graph-api,office365api,Office365,Microsoft Graph Api,Office365api,我们公司有12名协调员。每个协调员管理一组个人联系人 Coordinator1管理409个个人联系人 协调员2管理216个个人联系人 等等 我们有一个夜间任务,它填充一个SQL Server表,该表保存个人联系信息 表中的数据被提取到12个不同的CSV文件,然后发送给每个协调员 协调员有责任将此CSV文件导入其Outlook,以使其个人联系人列表保持最新(是的,这些个人联系人每天都会更改) 对于大多数协调员来说,整个CSV文件的导入都有点太多了,其目标是实现自动化,或者使Outlook个人联
- Coordinator1管理409个个人联系人
- 协调员2管理216个个人联系人
- 等等
表
,该表保存个人联系信息
表
中的数据被提取到12个不同的CSV文件
,然后发送给每个协调员
协调员有责任将此CSV文件导入其Outlook,以使其个人联系人列表保持最新(是的,这些个人联系人每天都会更改)
对于大多数协调员来说,整个CSV文件的导入都有点太多了,其目标是实现自动化,或者使Outlook个人联系人同步,这样这些协调员就不必执行此日常手动任务
我所尝试的:
我创建了一个C#控制台应用程序,并添加了ADAL和Microsoft Graph客户端库NuGet包
我已经在Azure中正确注册了我的应用程序,并获得了客户Id
和客户机密
我已经设置了相应的应用程序和委派权限
我能够运行应用程序,获取令牌
,并调用Microsoft Graph客户端
问题是:
在撰写本文时,我的问题是Microsoft Graph不支持创建联系人列表
,也不允许我在此联系人列表
中添加、删除或更新个人联系人
无法使用组
。每次向组中添加用户时,都会向该特定用户发送一封电子邮件,让他知道自己已添加到组中
此外,同一个用户可以将自己从组中删除,我们只是不希望这样
Microsoft Graph还支持创建文件夹
,并将人员添加到这些文件夹中,但不幸的是,我发现这些文件夹的唯一用途是组织内容
对于文件夹,我无法向特定文件夹发送电子邮件,而该文件夹又会向该文件夹中的每个人发送电子邮件。这就是联系人列表
的目的……但是,在撰写本文时,API没有任何关于联系人列表
的内容
有人有更好的建议或解决方法来完成我的任务吗
我不介意重写整个控制台应用程序,甚至完全改变整个方法(比如使用Powershell)
我所关心的就是不要再让这12位协调员手动导入CSV文件了
提前谢谢
PS:我甚至查看了Microsoft Flow,但还没有找到一个可以更新Outlook个人联系人的流。目前,两者都不支持“联系人组”
但是,您可以使用以编程方式创建它们。中有一个带有示例C#代码的演练 目前,双方都不支持“联络小组”
但是,您可以使用以编程方式创建它们。中有一个带有示例C#代码的演练 如果有人在乎的话,这就是最终结果
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;
}
}
static void Main(字符串[]args)
{
尝试
{
var domain=“mydomain.com”;
var email=“服务_account@mydomain.com";
var accountPassword=“Password1”;
var emailToImpersonify=“frank_underwood@mydomain.com";
var contactGroupDisplayName=“MySuperAmazingContactGroup”;
ExchangeService服务=新的ExchangeService(ExchangeVersion.Exchange2013);
service.Credentials=新的网络凭据(电子邮件、帐户密码、域);
自动发现URL(电子邮件、重定向URL验证回调);
//确保帐户[服务]正常_account@mydomain.com]是ApplicationImpersonation管理员角色的成员。
service.ImpersonatedUserId=新的ImpersonatedUserId(ConnectingIdType.SmtpAddress,emailToImpersonify);
//在创建ContactGroup之前,请检查并删除任何预先存在的ContactGroup
SearchFilter sfSearch=newsearchfilter.IsEqualTo(ContactGroupSchema.DisplayName,contactGroupDisplayName);
FindItemsResults=service.FindItems(WellKnownFolderName.Contacts,sfSearch,new ItemView(int.MaxValue));
如果(结果!=null)
{
foreach(结果中的项目)
item.Delete(DeleteMode.HardDelete);
}
//创建包含几个成员的新联系人组
ContactGroup newContactGroup=新联系人组(服务);
newContactGroup.DisplayName=contactGroupDisplayName;
newContactGroup.Members.Add(新组成员(“user1@contoso.com"));
newContactGroup.Members.Add(新组成员(“user2@contoso.com"));
newContactGroup.Save();
}
捕获(例外情况除外)
{
掷骰子;
}
}
如果有人在乎,这里是最终结果
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;
}
}
static void Main(字符串[]args)
{
尝试
{
var domain=“mydomain.com”;
var email=“服务_account@mydomain.com";
var accountPassword=“Password1”;
var emailToImpersonify=“frank_underwood@mydomain.com";
var contactGroupDisplayName=“MySuperAmazingContactGroup”;
ExchangeService服务=新的ExchangeService(ExchangeVersion.Exchange2013);
service.Credentials=新的网络凭据(电子邮件、帐户密码、域);
自动发现URL(电子邮件、重定向URL验证回调);
//确保帐户[服务]正常_account@mydomain.com]是ApplicationImpersonation管理员角色的成员。
service.ImpersonatedUserId=新的ImpersonatedUserId(ConnectingIdType.SmtpAddress,emailToImpersonify);
//在创建ContactGroup之前,请检查并删除任何预先存在的联系人