使用Exchange Web服务API确定邮箱是否存在

时间:2012-07-24 08:47:08

标签: c# .net active-directory exchangewebservices

使用Exchange Web Services API,是否可以确定组织中是否存在 someone@mydomain.com 等邮箱/电子邮件地址?

如果是这样,这是最简单的方法,是否可以不使用模仿?

案例:Windows服务会定期向组织内的人员发送电子邮件。它没有任何关于他们的电子邮件地址的明确知识。它只知道他们的用户名,并假设他们的电子邮件地址是用户名 @mydomain.com。对于所有用户都是如此,除了少数没有邮箱的用户。在这些情况下,它不应该首先尝试发送电子邮件。

解决方案:

根据mathieu的建议:在Active Directory中查找用户和电子邮件地址。这个功能完成了工作:

using System.DirectoryServices.AccountManagement;
// ...

public static bool TryGetUserEmailAddress(string userName, out string email)
{
  using (PrincipalContext domainContext = 
    new PrincipalContext(ContextType.Domain, Environment.UserDomainName))
  using (UserPrincipal user = 
    UserPrincipal.FindByIdentity(domainContext, userName))
  {
    if (user != null && !string.IsNullOrWhiteSpace(user.EmailAddress))
    {
      email = user.EmailAddress;
      return true;
    }
  }
  email = null;
  return false; // user not found or no e-mail address specified
}

2 个答案:

答案 0 :(得分:1)

确定用户是否只有一个带有EWS的邮箱可能比预期的更复杂,尤其是没有假冒。

如果您位于Active Directory域中,则应依赖DirectoryEntry信息来确定用户的邮箱,并相应地发送电子邮件。如果您的用户登录,则很容易获得关联的DirectoryEntry。

答案 1 :(得分:0)

有一种简单的方法可以通过检查用户的可用性来做到这一点,例如以下代码。 我试过了,它对我有用。

对于可用性结果返回错误的其他情况,我不确定,但是可以肯定的是,如果电子邮件不正确,它会这样做

要定义您的交换服务,请参阅:https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/get-started-with-ews-managed-api-client-applications

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);//You version
service.Credentials = new WebCredentials("user1@contoso.com", "password");
service.AutodiscoverUrl("user1@contoso.com", RedirectionUrlValidationCallback);
string email = "TEST@YOUR.COM";

// Get User Availability after 6 months 
AttendeeInfo attendee = new AttendeeInfo(email);
var attnds = new List<AttendeeInfo>();
attnds.Add(attendee);
var freeTime = service.GetUserAvailability(attnds, new 
TimeWindow(DateTime.Now.AddMonths(6), DateTime.Now.AddMonths(6).AddDays(1)), AvailabilityData.FreeBusyAndSuggestions);
//if you receive result with error then there is a big possibility that the email is not right
if(freetimes.AttendeesAvailability.OverallResult == ServiceResult.Error)
{
     return false;
}
return true;