【问题标题】:Finding the Public Folder for a certain mail address查找特定邮件地址的公用文件夹
【发布时间】:2016-04-21 18:53:33
【问题描述】:

在一个公用文件夹邮箱中,我有两个启用邮件的文件夹。

  • 文件夹 1 的电子邮件地址是 folder1@contoso.com
  • 文件夹 2 的电子邮件地址是 folder2@contoso.com

现在,当为 GAL 选择所有 Active Directory 条目时,有一些条目:

  • 显示名称“文件夹 1”,邮件“文件夹 1@contoso.com”
  • 显示名称“文件夹 2”,邮件“folder2@contoso.com”
  • 显示名称“用户 1”,邮件“user1@contoso.com”
  • ...
  • 显示名称“用户 100”,邮件“user100@contoso.com”

因此,我自然会为这些电子邮件地址调用 EWS 自动发现。这适用于所有用户,但不适用于公用文件夹 - 它表示找不到该电子邮件地址的邮箱。所以我从 Active Directory 中获取了邮箱的电子邮件地址并连接到该地址。

但是我现在怎样才能遍历到相应的文件夹呢?我试过了:

FolderView view = new FolderView(1);
view.Traversal = FolderTraversal.Shallow;
var folders = ews.FindFolders(
        WellKnownFolderName.Root, 
        new SearchFilter.IsEqualTo(
            FolderSchema.DisplayName, // <- how can I search by the folder's email address?
            displayName
        ), view);

这会引发以下非常有用的错误消息:

Internal Server Error. The operation failed.

为了完整起见,创建了以下 EWS XML:

<Trace Tag="EwsRequest" Tid="121" Time="2016-03-23 13:31:41Z" Version="15.00.0913.015">
  <?xml version="1.0" encoding="utf-8"?>
  <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
      <t:RequestServerVersion Version="Exchange2013" />
      <t:ExchangeImpersonation>
        <t:ConnectingSID>
          <t:SmtpAddress>testpublicfoldermailbox@contoso.com</t:SmtpAddress>
        </t:ConnectingSID>
      </t:ExchangeImpersonation>
    </soap:Header>
    <soap:Body>
      <m:FindFolder Traversal="Shallow">
        <m:FolderShape>
          <t:BaseShape>AllProperties</t:BaseShape>
        </m:FolderShape>
        <m:IndexedPageFolderView MaxEntriesReturned="1" Offset="0" BasePoint="Beginning" />
        <m:Restriction>
          <t:IsEqualTo>
            <t:FieldURI FieldURI="folder:DisplayName" />
            <t:FieldURIOrConstant>
              <t:Constant Value="Test Public Folder Mailbox" />
            </t:FieldURIOrConstant>
          </t:IsEqualTo>
        </m:Restriction>
        <m:ParentFolderIds>
          <t:DistinguishedFolderId Id="root" />
        </m:ParentFolderIds>
      </m:FindFolder>
    </soap:Body>
  </soap:Envelope>
</Trace>

以及服务器的以下响应:

<Trace Tag="EwsResponse" Tid="121" Time="2016-03-23 13:31:41Z" Version="15.00.0913.015">
  <?xml version="1.0" encoding="utf-8"?>
  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
      <s:Fault>
        <faultcode xmlns:a="http://schemas.microsoft.com/exchange/services/2006/types">a:ErrorInternalServerError</faultcode>
        <faultstring xml:lang="de-DE">Interner Serverfehler. Fehler bei diesem Vorgang.</faultstring>
        <detail>
          <e:ResponseCode xmlns:e="http://schemas.microsoft.com/exchange/services/2006/errors">ErrorInternalServerError</e:ResponseCode>
          <e:Message xmlns:e="http://schemas.microsoft.com/exchange/services/2006/errors">Interner Serverfehler. Fehler bei diesem Vorgang.</e:Message>
        </detail>
      </s:Fault>
    </s:Body>
  </s:Envelope>
</Trace>

什么可能导致该问题,或者我在哪里可以找到有关此问题发生原因的更多信息?

【问题讨论】:

    标签: c# exchange-server exchangewebservices ews-managed-api


    【解决方案1】:

    这里有一些问题首先您不能使用 EWS 或任何邮箱访问 API 直接打开公用文件夹邮箱您应该通过正确的 API 端点访问公用文件夹,例如 DistinguishedFolderIdNameType.publicfoldersroot 以及您尝试模仿公共文件夹邮箱,例如

        <t:ConnectingSID>
          <t:SmtpAddress>testpublicfoldermailbox@contoso.com</t:SmtpAddress>
        </t:ConnectingSID>
    

    您不能这样做,您只能模拟一个有效用户,在访问公用文件夹树的情况下,您应该使用对您希望访问的公用文件夹具有权限的用户。您应该对 PublicFolder 邮箱 SMTP 做的唯一事情是设置路由标头以确保您的请求被正确路由,请参阅 https://msdn.microsoft.com/en-us/library/office/dn818490(v=exchg.150).aspx

    要查找公用文件夹以用户身份连接并搜索公用文件夹树及其所有子级,您不能对公用文件夹树使用深度遍历,因此您需要为每个子级分别提出浅层遍历请求文件夹级别。我有执行此操作的 EWS Power shell 库以及枚举 MailEnabled 文件夹等可能有用的东西https://github.com/gscales/Powershell-Scripts/blob/master/PublicFolderMod.ps1

    如果您有 Exchange 2013,则可以使用 Exchange 管理 Shell Get-MailPublicFolder cmdlet 获取文件夹的 HexEntryId,然后使用 ConvertId 将其转换为 EWSid 并直接绑定到文件夹。

    干杯 格伦

    【讨论】:

    • 详细说明:我发现Get-MailPublicFolder 中的HexEntryId 与LDAP/AD 中的msExchPublicFolderEntryId 相同,因此我什至可以在没有安装PowerShell 的情况下获取它们。 ConvertId 返回类似于UniqueId 的内容(尽管它最后没有任何=)。但是当我尝试绑定文件夹时,错误信息是“ID 无效”。
    【解决方案2】:

    对于那些正在搜索的人,一些 C# 代码绑定到某个公用文件夹:

    AlternatePublicFolderId hexId = new AlternatePublicFolderId(IdFormat.HexEntryId, directoryEntry.msExchPublicFolderEntryId);
    AlternatePublicFolderId ewsId = service.ConvertId(hexId, IdFormat.EwsId) as AlternatePublicFolderId;
    calendar = CalendarFolder.Bind(service, new FolderId(ewsId.FolderId));
    

    【讨论】:

      猜你喜欢
      • 2020-05-20
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 2016-11-22
      相关资源
      最近更新 更多