【问题标题】:How get the current user's own email address or check entered, using Exchange Web Services (EWS)?如何使用 Exchange Web Services (EWS) 获取当前用户自己的电子邮件地址或输入的支票?
【发布时间】:2016-08-25 16:37:09
【问题描述】:

我必须使用外部 Exchange 服务器。如何使用 EWS 获取用户输入的自己的电子邮件地址或检查地址(他完全介绍了自己的地址)? 电子邮件地址与用户名不同。

【问题讨论】:

    标签: exchangewebservices ews-managed-api


    【解决方案1】:

    此时的best solution

    您可以将 ConvertId 与通用地址一起使用,然后 Exchange 将返回该邮箱的 PrimarySMTP,例如。

    Folder Inbox = Folder.Bind(service, WellKnownFolderName.Inbox);
    AlternateId aiAlternateid = new AlternateId(IdFormat.EwsId, Inbox.Id.UniqueId, "mailbox@domain.com");
    AlternateIdBase aiResponse = service.ConvertId(aiAlternateid, IdFormat.EwsId);
    Console.WriteLine(((AlternateId)aiResponse).Mailbox);
    

    【讨论】:

    • 这个技巧非常适合我使用 OAuth,而不是使用 Impersonation。在这种情况下,我可以让我的脚本/应用程序在任何地方/任何机器上运行,而无需从中提取其他环境线索。非常感谢。
    • 我已经使用了它,现在有一个函数可能会在我的所有 EWS 脚本中找到它的方式:function Get-OAuthUserSmtpAddress ($ExSvc) { $ExSvc.ConvertId( [AlternateId]:: New('EwsId', ([Folder]::Bind($ExSvc, 'Root')).Id.UniqueId, 'OAuthUserSmtpFinder@LargeItems.ps1'), 'EwsId').Mailbox } $Mailbox = Get-OAuthUserSmtpAddress $ ExSvc 再次感谢。
    【解决方案2】:

    您可能对 ResolveName 方法有一些运气。使用此方法,您可以搜索用户的全局地址列表。并通过使用简单的 if else 来查看是否返回了任何结果。此方法确实可以解决模棱两可的名称,因此请务必仔细检查结果

    例子:

       NameResolutionCollection coll = service.ResolveName("Johnson", folders, ResolveNameSearchLocation.DirectoryOnly, false);
    
       foreach (NameResolution nameRes in coll)
       {
          Console.WriteLine("Contact name: " + nameRes.Mailbox.Name);
          Console.WriteLine("Contact e-mail address: " + nameRes.Mailbox.Address);
          Console.WriteLine("Mailbox type: " + nameRes.Mailbox.MailboxType);
       }
    

    如果您想了解更多信息:https://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.exchangeservice.resolvename(v=exchg.80).aspx

    【讨论】:

      【解决方案3】:

      根据iCode4U 的回答,如果您的服务使用默认凭据(来自登录用户),那么这可能会满足您的需求:

      String address = service.ResolveName(Environment.UserName)(0).Mailbox.Address;
      

      编辑:如果不能相信上述查询所带来的结果的唯一性,那么最好使用这样的东西(这在我的组织中可以工作,用户名也是电子邮件标识符,但每个人都必须对其进行调整以适应自己的情况):

      string address = Service.ResolveName(Environment.UserName).Select(
          a => a.Mailbox.Address).FirstOrDefault(
          b => b.StartsWith(Environment.UserName + "@",
              StringComparison.InvariantCultureIgnoreCase));
      

      【讨论】:

      • 没有。这没用。你可能会得到错误的记录。用户名最后可能相差一个字符。在这种情况下,它将取决于排序。
      • 是的,有时它可以工作。但我一直在寻找一个通用的解决方案。当我没有与 Active Directory 连接并且没有任何电子邮件地址(不是主要地址)时。只有用户名和密码。
      • 你是对的,这就是为什么我赞成你的回答。
      【解决方案4】:

      我们使用加载在用户 PowerShell 配置文件中的这个函数。

          Function CurrentUserPrimarySmtpAddress()
          {
            <#
              .SYSNOPSIS
                Attempt to retrieve the current user's primary SMTP address.
      
              .DESCRIPTION
                Attempt to retrieve the current user's primary SMTP address.
      
              .NOTES
                Author: David Barrett
                Date Created: 08NOV2016
      
              .LINK
                https://gallery.technet.microsoft.com/office/PowerShellEWS-Update-items-48c3dcfc
      
              .EXAMPLE
                $PrimarySmtpAddress = CurrentUserPrimarySmtpAddress
            #>
      
            $searcher = [adsisearcher]"(samaccountname=$env:USERNAME)"
            $result = $searcher.FindOne()
      
            if ($result -ne $null)
            {
              return $result.Properties["mail"]
            }
            return $null
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-17
        • 2012-06-01
        • 2014-04-07
        • 2018-12-13
        • 2018-10-27
        • 1970-01-01
        • 1970-01-01
        • 2011-09-07
        相关资源
        最近更新 更多