c# - 如何使用 EWS 检索有关启用 Exchange 邮件的公用文件夹的邮件相关信息

标签 c# powershell exchangewebservices

使用 PowerShell,我可以调用 Get-MailPublicFolder 来检索有关启用 Exchange 邮件的公用文件夹的邮件相关信息。

我想使用 EWS 做同样的事情。特别是获取公共(public)文件夹电子邮件地址。

到目前为止,我已设法将公用文件夹作为 Microsoft.Exchange.WebServices.Data.Folder 对象的列表获取。但我在文件夹对象上看不到返回文件夹电子邮件地址的属性。我检查了 ExtendedProperties 属性,它是一个空列表。

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
service.UseDefaultCredentials = true;

// Use Autodiscover to set the URL endpoint.
service.AutodiscoverUrl("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="741e1b115a16181b13130734191d17061b071b12005a171b19" rel="noreferrer noopener nofollow">[email protected]</a>");

Folder rootfolder = Folder.Bind(service, WellKnownFolderName.PublicFoldersRoot);
FolderView folderView = new FolderView(1000);

foreach (Folder folder in rootfolder.FindFolders(folderView))
{
    folder.Load();
    System.Diagnostics.Debug.WriteLine("Folder Name: " + folder.DisplayName);

    if (folder.ExtendedProperties.Count > 0)
    {
        foreach (ExtendedProperty ep in folder.ExtendedProperties)
        {
            System.Diagnostics.Debug.WriteLine(" " + ep.PropertyDefinition.Name + " = " + ep.Value);
        }
    }                    
}

有人可以向我展示如何使用 EWS 执行此操作的示例吗?

谢谢

更新

我已将 Shay 发布的代码转换为 C#,并且它可以工作:)

以下是转换为 C# 的代码:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
service.UseDefaultCredentials = true;

// Use Autodiscover to set the URL endpoint.
service.AutodiscoverUrl("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4822272d662a24272f2f3b0825212b3a273b272e3c662b2725" rel="noreferrer noopener nofollow">[email protected]</a>");

Folder rootfolder = Folder.Bind(service, WellKnownFolderName.PublicFoldersRoot);

FolderView folderView = new FolderView(1000);
ExtendedPropertyDefinition proxyProp = new ExtendedPropertyDefinition(26397, MapiPropertyType.Binary);
folderView.PropertySet = new PropertySet(proxyProp);

foreach (Folder folder in rootfolder.FindFolders(folderView))
{
    object objectGuid;
    if (folder.TryGetProperty(proxyProp, out objectGuid))
    {
        objectGuid = System.BitConverter.ToString((byte[])objectGuid).Replace("-", "");
        var adFolder = new DirectoryEntry(string.Format("LDAP://<GUID={0}>", objectGuid.ToString()));
        var mailVal = adFolder.Properties["Mail"].Value;
    }
}

最佳答案

我可以通过以下内容获得它,您需要将其转换为 c#。结果是一个使用 Email 属性扩展的文件夹对象。

$PR_PF_PROXY = New-Object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition 26397,[Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Binary
$view.PropertySet.Add($PR_PF_PROXY) 

$foldersResult = $ExchangeService.FindFolders(Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::PublicFoldersRoot,$view)

    foreach($folder in $foldersResult.Folders)
    {  
        $folder = $folder | Add-Member -MemberType NoteProperty -Name Email -Value $null -PassThru

        $guid=$null
        if($folder.TryGetProperty($PR_PF_PROXY,[ref]$guid))
        {
            $dn=[bitconverter]::ToString($guid) -replace '-'
            $folder.Email = ([ADSI]"LDAP://<GUID=$dn>").Properties.mail.value
        }

        $folder
    } 

关于c# - 如何使用 EWS 检索有关启用 Exchange 邮件的公用文件夹的邮件相关信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17211270/

相关文章:

c# - 从对象中获取 List<T> 的类型

c# - 源代码管理中的存储过程 - 自动化构建/部署过程

c# - 在 C# 项目中将 C# 字符串转换为 MFC CString?

powershell - 如何使用Powershell从SharePoint Online文档库中的文档获取 “Copy Link”

c# - 如果 IP 地址或主机名是本地主机,如何检查 Powershell?没有域 DNS

c# - 如何使用 EWS 托管 API 保存项目附件

c# - 无法枚举 C# 中的 F# 列表列表

powershell - 使用Powershell将文本文件中特定行的部分复制到单独的文件中

xml - 交换 : Find items in EWS conversation using XML request?

java - 用于连接到 Outlook Exchange Server 的 Exchange Web 服务 (EWS) 或 JavaMail Api - Java