1

我让自己有点晕头转向。

我正在尝试通过 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并且文件夹有自己的Id以及ParentFolderId.

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

我认为我现在的计划是:

  1. Deep我将使用文件夹遍历而不是文件夹遍历Shallow,它只给我当前绑定到的文件夹的子文件夹。
  2. 遍历文件夹并创建一个由文件夹的Idas 键和它们的DisplayNameas 值组成的哈希映射。向文件夹对象添加一个新属性。类似的东西\\<foldername>
  3. 那些有孩子的文件夹将被一次提取一层,我将ParentFolderId在哈希图中查找它们,并将使用提取的值更新并附加它们自己的值DisplayName以获得它们的绝对位置 - 例如\\Inbox从父级并将其附加到他们自己的DisplayName,这可能是Economy导致\\Inbox\Economy路径的东西,就像在(1)中一样,我将添加到对象中。
  4. 重复此过程,直到所有文件夹都已处理和映射。从ParentFolderId邮件中,我现在应该能够知道他们的绝对位置。我认为...

抱歉,如果以上内容一团糟,我对递归函数和 EWS 的速度都不太了解。

任何帮助将不胜感激,如果您需要我澄清任何细节,请询问。

在此先感谢基督教

4

1 回答 1

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
于 2020-09-15T22:22:15.473 回答