Outlook联系人将在第二天创建和删除 背景:
我正在开发一个C#控制台应用程序,它可以为11个使用Exchange Web服务(EWS)的用户创建和/或更新Outlook联系人 应用程序需要模拟这11个用户,以便正确创建/更新他们各自的Outlook联系人 该应用程序有一个专门的Outlook联系人将在第二天创建和删除 背景:,outlook,office365,exchangewebservices,Outlook,Office365,Exchangewebservices,我正在开发一个C#控制台应用程序,它可以为11个使用Exchange Web服务(EWS)的用户创建和/或更新Outlook联系人 应用程序需要模拟这11个用户,以便正确创建/更新他们各自的Outlook联系人 该应用程序有一个专门的[ServiceAccount],他恰好是ApplicationImpersonation管理员角色的成员 问题是: 我正在启动应用程序,它运行正常 它为User1创建了223个新联系人 它为User2创建了117个新联系人 等…直到到达用户11 为了验证一切
[ServiceAccount]
,他恰好是ApplicationImpersonation
管理员角色的成员
问题是: 我正在启动应用程序,它运行正常
- 它为User1创建了223个新联系人
- 它为User2创建了117个新联系人
- 等…直到到达用户11
结论: 人们是如何开始调查这件事的?我不是交易所的专家 下面是我用来创建联系人的代码
private void AddNewOutlookContacts(IEnumerable<Person> contactsToCreate, string emailToImpersonify)
{
var service = new ExchangeService(ExchangeVersion.Exchange2013);
service.Credentials = new NetworkCredential(_serviceAccount, _serviceAccountPwd, _domain);
service.Url = new Uri(_office365ExchangeUrl);
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, emailToImpersonify);
Collection<Contact> contactItems = new Collection<Contact>();
foreach (var c in contactsToCreate)
{
Contact newContact = new Contact(service);
newContact.GivenName = c.FirstName;
newContact.MiddleName = c.LastName;
newContact.FileAsMapping = FileAsMapping.SurnameCommaGivenName;
newContact.DisplayName = string.Format("{0} {1}", c.FirstName, c.LastName);
newContact.PhoneNumbers[PhoneNumberKey.HomePhone] = c.HomePhone;
newContact.PhoneNumbers[PhoneNumberKey.BusinessPhone] = c.WorkPhone;
newContact.PhoneNumbers[PhoneNumberKey.MobilePhone] = c.CellPhone;
newContact.EmailAddresses[EmailAddressKey.EmailAddress1] = new EmailAddress(c.Email);
newContact.JobTitle = c.JobTitle;
contactItems.Add(newContact);
}
// Batch Create...
ServiceResponseCollection<ServiceResponse> response = service.CreateItems(contactItems, WellKnownFolderName.Contacts, null, null);
if (response.OverallResult == ServiceResult.Success)
{
Console.WriteLine("SUCCESS");
}
else
{
Console.WriteLine("FAILED");
}
}
private void AddNewOutlookContacts(IEnumerable contacts创建,字符串emailToImpersonify)
{
var服务=新的ExchangeService(ExchangeVersion.Exchange2013);
service.Credentials=新的网络凭据(\u serviceCount、\u serviceCountPwd、\u domain);
Url=新的Uri(_office365ExchangeUrl);
service.ImpersonatedUserId=新的ImpersonatedUserId(ConnectingIdType.SmtpAddress,emailToImpersonify);
Collection contactItems=新集合();
foreach(contactsToCreate中的变量c)
{
联系人newContact=新联系人(服务);
newContact.GivenName=c.FirstName;
newContact.MiddleName=c.LastName;
newContact.FileAsMapping=FileAsMapping.namescommagivenname;
newContact.DisplayName=string.Format(“{0}{1}”,c.FirstName,c.LastName);
newContact.PhoneNumbers[PhoneNumberKey.HomePhone]=c.HomePhone;
newContact.PhoneNumbers[PhoneNumberKey.BusinessPhone]=c.WorkPhone;
newContact.PhoneNumbers[PhoneNumberKey.MobilePhone]=c.mobile;
newContact.EmailAddresses[EmailAddressKey.EmailAddress1]=新的电子邮件地址(c.Email);
newContact.JobTitle=c.JobTitle;
contactItems.Add(新增联系人);
}
//批量创建。。。
ServiceResponseCollection response=service.CreateItems(contactItems,WellKnownFolderName.Contacts,null,null);
if(response.OverallResult==servicesult.Success)
{
Console.WriteLine(“成功”);
}
其他的
{
控制台写入线(“失败”);
}
}
没有任何代码可以删除联系人
任何关于Exchange上运行什么导致这些联系人自动消失的想法
有日志文件可以查吗
任何能帮我阐明这一点的东西都会很棒
最后一件事,所有这11个用户的联系人都会消失 解决方案:
我找到了罪魁祸首,以下是解决方案:
在我之前提供的代码中,我省略了(为了简洁起见)插入多个电子邮件地址的事实,如下所示:
if (!string.IsNullOrEmpty(c.RLEmail))
newContact.EmailAddresses[EmailAddressKey.EmailAddress1] = new EmailAddress(c.Email);
if (!string.IsNullOrEmpty(c.PersonalEmail))
newContact.EmailAddresses[EmailAddressKey.EmailAddress2] = new EmailAddress(c.PersonalEmail);
if (!string.IsNullOrEmpty(c.UnionEmail))
newContact.EmailAddresses[EmailAddressKey.EmailAddress3] = new EmailAddress(c.UnionEmail);
虽然代码在插入电子邮件地址之前会检查IsNullOrEmpty()
,但代码不会验证这些电子邮件地址的唯一性
这就是问题所在
使用测试数据,我创建了一组具有唯一电子邮件地址1
的联系人
但是对于EmailAddress2
和EmailAddress3
,我的测试数据没有唯一的电子邮件地址,因此这两个字段中存在重复的地址
出于某种原因,我的印象是,这些第二和第三个电子邮件地址是否有重复项并不重要,但我错了(而且它们也是唯一的,这很有道理)
长话短说,Exchange必须有一个正在运行的作业来清理和删除在EmailAddress2
和EmailAddress3
中包含重复电子邮件地址的联系人