根据Id和ParentFolderId解析从EWS返回的项目的完整路径

时间:2012-10-25 19:44:08

标签: powershell recursion exchangewebservices

我已经陷入了一阵骚扰。

我正在尝试通过Powershell和Exchange Webservices API获取Exchange 2010邮箱的全部内容。

我实际上有文件夹和邮件项目,这样就好了。

我需要能够添加每个邮件项目的完整文件夹路径,这样当我将整个文件导出到xml og csv时,我可以按照文件夹的路径对电子邮件进行分组。

我能够很好地检索文件夹和电子邮件。

以下是我从某个文件夹中获取邮件的方式:

$ExchangeFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($ExchangeService, [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::$FolderName)
[array] $ExchangeItems = $ExchangeFolder.FindItems($ItemLimit)

$PropertySet = New-Object
Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
$PropertySet.RequestedBodyType = [Microsoft.Exchange.WebServices.Data.BodyType]::$BodyType

foreach ($ExchangeItem in $ExchangeItems)
{
    $ExchangeItem.Load($PropertySet)
    Write-Output $ExchangeItem 
}

我获取文件夹的方式:

$RootFolderId = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$MailboxName)
$RootFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($ExchangeService,$RootFolderId) 
$FolderView = New-Object Microsoft.Exchange.WebServices.Data.FolderView(10000); 
$FolderView.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep
$FolderView.PropertySet = $Propset 
$FolderResponse = $RootFolder.FindFolders($FolderView);

邮件通过ParentFolderId映射到其文件夹,文件夹有自己的IdParentFolderId

根据这些信息,我的意思是以某种方式能够抓住随机文件夹,并通过ParentFolderId能够告诉它的完整路径。我想,它与制作递归函数有关,但我似乎无法绕过它。

我认为我现在的计划是:

  1. 而不是Deep文件夹遍历,我将使用Shallow,它只会给我文件夹,这些文件夹是我当前绑定到的文件夹的子文件。
  2. 遍历文件夹并创建一个哈希映射,其中包含文件夹Id作为键,其DisplayName作为值。将新属性添加到文件夹对象。像\\<foldername>
  3. 之类的东西
  4. 那些有任何孩子的文件夹将被提取,一次一个级别,我将在哈希映射中查找他们的ParentFolderId并将使用获取的值进行更新并将其附加到他们的拥有DisplayName来获取他们的绝对位置 - 例如来自父级的\\Inbox并将其附加到他们自己的DisplayName,这可能是Economy导致\\Inbox\Economy路径,我就像在(1)中将添加到对象。
  5. 重复此过程,直到处理完所有文件夹并进行映射。使用邮件中的ParentFolderId,我现在应该能够告诉他们的绝对位置。我想......
  6. 对不起,如果以上是一个完整的混乱,我还没有完全掌握递归函数和EWS。

    我们非常感谢您的帮助,如果您需要我澄清任何细节,请询问。

    提前致谢 基督教

1 个答案:

答案 0 :(得分:0)

我遇到了这个问题,并使用了一个递归函数来找出电子邮件项目的完整路径。 (这也是我的新手。这可能不是最好的方法,但它确实有效)

  1. 获取所有文件夹以存储“ ID”和“ ParentFolderId”属性。
    $view = New-Object Microsoft.Exchange.WebServices.Data.FolderView(999)
    $view.PropertySet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.Webservices.Data.BasePropertySet]::FirstClassProperties)
    $view.PropertySet.Add([Microsoft.Exchange.Webservices.Data.FolderSchema]::DisplayName)
    $view.Traversal = [Microsoft.Exchange.Webservices.Data.FolderTraversal]::Deep
    $findFolderResults = $service.FindFolders([Microsoft.Exchange.Webservices.Data.WellKnownFolderName]::MsgFolderRoot, $view)
  1. 将找到的文件夹属性以及您要查找的电子邮件项目的父文件夹ID传递给递归函数。
    function jjRecursion{
      param (
      [Parameter(Mandatory=$true, Position=0)]
      $results,
      [Parameter(Mandatory=$true, Position=1)]
      $Id
      )
    $fullPath = @()
    $results | % {
        if ($_.id.UniqueId -eq $Id) {
            $fullPath += $($_.displayname)
            jjRecursion $results $_.ParentFolderId.UniqueId
        }
        else {}
    }
    RETURN $fullPath
    }
    
    $findPath = jjRecursion $findFolderResults $Item.ParentFolderId.UniqueId