Outlook联系人将在第二天创建和删除 背景:

Outlook联系人将在第二天创建和删除 背景:,outlook,office365,exchangewebservices,Outlook,Office365,Exchangewebservices,我正在开发一个C#控制台应用程序,它可以为11个使用Exchange Web服务(EWS)的用户创建和/或更新Outlook联系人 应用程序需要模拟这11个用户,以便正确创建/更新他们各自的Outlook联系人 该应用程序有一个专门的[ServiceAccount],他恰好是ApplicationImpersonation管理员角色的成员 问题是: 我正在启动应用程序,它运行正常 它为User1创建了223个新联系人 它为User2创建了117个新联系人 等…直到到达用户11 为了验证一切

我正在开发一个C#控制台应用程序,它可以为11个使用Exchange Web服务(EWS)的用户创建和/或更新Outlook联系人

应用程序需要模拟这11个用户,以便正确创建/更新他们各自的Outlook联系人

该应用程序有一个专门的
[ServiceAccount]
,他恰好是
ApplicationImpersonation
管理员角色的成员


问题是: 我正在启动应用程序,它运行正常

  • 它为User1创建了223个新联系人
  • 它为User2创建了117个新联系人
  • 等…直到到达用户11
为了验证一切正常,我导航到Office 365并登录到User1的帐户(使用他的凭据),我可以看到223个新创建的联系人

我很高兴,我退出了

第二天,我做的第一件事就是登录User1的帐户(使用他的凭据),我不再看到223个联系人,而是看到7个联系人

由于未知原因,User1的联系人中有216个联系人已完全消失

我查看了User1删除的邮件,我看到了其中的216个联系人


结论: 人们是如何开始调查这件事的?我不是交易所的专家

下面是我用来创建联系人的代码

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
中包含重复电子邮件地址的联系人