查找某个邮件地址的 Public 文件夹
Finding the Public Folder for a certain mail address
在一个 public 文件夹邮箱中,我有两个启用邮件的文件夹。
- 文件夹 1 有电子邮件地址 folder1@contoso.com
- 文件夹 2 有电子邮件地址 folder2@contoso.com
现在为 GAL 选择所有 Active Directory 条目时,有一些条目:
- 显示名称"Folder 1",邮件"folder1@contoso.com"
- 显示名称"Folder 2",邮件"folder2@contoso.com"
- 显示名称"User 1",邮件"user1@contoso.com"
- ...
- 显示名称"User 100",邮件"user100@contoso.com"
所以,我自然会为这些电子邮件地址调用 EWS 自动发现。这适用于所有用户,但不适用于 public 文件夹 - 它表示找不到该电子邮件地址的邮箱。所以我从 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>
是什么导致了这个问题,或者我在哪里可以找到关于为什么会出现这个问题的更多信息?
这里有一些问题,首先您不能使用 EWS 或任何邮箱访问 API 直接打开 Public 文件夹邮箱您应该访问 Public 通过正确的 API 端点的文件夹,例如 DistinguishedFolderIdNameType.publicfoldersroot 您还试图模拟 Public 文件夹邮箱,例如
<t:ConnectingSID>
<t:SmtpAddress>testpublicfoldermailbox@contoso.com</t:SmtpAddress>
</t:ConnectingSID>
您不能这样做,您只能冒充有效用户,在访问 Public 文件夹树的情况下,您应该使用有权访问您希望的 Public 文件夹的用户访问。对于 Public 文件夹邮箱 SMTP,您唯一应该做的就是设置路由 headers 以确保正确路由您的请求,请参阅 https://msdn.microsoft.com/en-us/library/office/dn818490(v=exchg.150).aspx
要查找 Public 文件夹,请以用户身份连接并搜索 Public 文件夹树及其所有内容 children,您不能对 [= 使用深度遍历30=] 文件夹树,因此您需要为每个 Child 文件夹级别发出单独的浅遍历请求。我有执行此操作的 EWS Power shell 库和一些可能有用的东西,例如枚举 MailEnabled 文件夹等 https://github.com/gscales/Powershell-Scripts/blob/master/PublicFolderMod.ps1
如果您有 Exchange 2013,您可以使用 Exchange 管理 Shell Get-MailPublicFolder cmdlet 获取文件夹的 HexEntryId,然后使用 ConvertId 将其转换为 EWSid 并直接绑定到文件夹。
干杯
格伦
对于那些正在搜索的人,一些 C# 代码绑定到某个 public 文件夹:
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));
在一个 public 文件夹邮箱中,我有两个启用邮件的文件夹。
- 文件夹 1 有电子邮件地址 folder1@contoso.com
- 文件夹 2 有电子邮件地址 folder2@contoso.com
现在为 GAL 选择所有 Active Directory 条目时,有一些条目:
- 显示名称"Folder 1",邮件"folder1@contoso.com"
- 显示名称"Folder 2",邮件"folder2@contoso.com"
- 显示名称"User 1",邮件"user1@contoso.com"
- ...
- 显示名称"User 100",邮件"user100@contoso.com"
所以,我自然会为这些电子邮件地址调用 EWS 自动发现。这适用于所有用户,但不适用于 public 文件夹 - 它表示找不到该电子邮件地址的邮箱。所以我从 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>
是什么导致了这个问题,或者我在哪里可以找到关于为什么会出现这个问题的更多信息?
这里有一些问题,首先您不能使用 EWS 或任何邮箱访问 API 直接打开 Public 文件夹邮箱您应该访问 Public 通过正确的 API 端点的文件夹,例如 DistinguishedFolderIdNameType.publicfoldersroot 您还试图模拟 Public 文件夹邮箱,例如
<t:ConnectingSID>
<t:SmtpAddress>testpublicfoldermailbox@contoso.com</t:SmtpAddress>
</t:ConnectingSID>
您不能这样做,您只能冒充有效用户,在访问 Public 文件夹树的情况下,您应该使用有权访问您希望的 Public 文件夹的用户访问。对于 Public 文件夹邮箱 SMTP,您唯一应该做的就是设置路由 headers 以确保正确路由您的请求,请参阅 https://msdn.microsoft.com/en-us/library/office/dn818490(v=exchg.150).aspx
要查找 Public 文件夹,请以用户身份连接并搜索 Public 文件夹树及其所有内容 children,您不能对 [= 使用深度遍历30=] 文件夹树,因此您需要为每个 Child 文件夹级别发出单独的浅遍历请求。我有执行此操作的 EWS Power shell 库和一些可能有用的东西,例如枚举 MailEnabled 文件夹等 https://github.com/gscales/Powershell-Scripts/blob/master/PublicFolderMod.ps1
如果您有 Exchange 2013,您可以使用 Exchange 管理 Shell Get-MailPublicFolder cmdlet 获取文件夹的 HexEntryId,然后使用 ConvertId 将其转换为 EWSid 并直接绑定到文件夹。
干杯 格伦
对于那些正在搜索的人,一些 C# 代码绑定到某个 public 文件夹:
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));