【问题标题】:Script to download emails from Exchange as HTML, Can't use outlook从 Exchange 下载电子邮件为 HTML 的脚本,无法使用 Outlook
【发布时间】:2014-08-01 05:40:26
【问题描述】:

我已经有一个脚本可以使用 EWS 下载电子邮件附件,以避免安装/打开 Outlook。 我现在想保存电子邮件内容,最好保存为 HTML 文件,否则保存为 .eml 或 .msg。

我关于附件的另一个帖子在这里:Download attachments with multiple subjects from Exchange

我希望能以某种方式改编现有的脚本,但老实说我不知道​​。

$MailboxName = "me@mymail.com"
$Subjects = @(
          'Subject1',
          'Subject2'
        )

[regex]$SubjectRegex = ‘^(?i)(‘ + (($Subjects |foreach {[regex]::escape($_)}) –join “|”) + ‘)$’

$downloadDirectory = "C:\temp"


Function FindTargetFolder($FolderPath){
$tfTargetidRoot = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot,$MailboxName)
$tfTargetFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$tfTargetidRoot)

for ($lint = 1; $lint -lt $pfArray.Length; $lint++) {
    $pfArray[$lint]
    $fvFolderView = new-object Microsoft.Exchange.WebServices.Data.FolderView(1)
    $SfSearchFilter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+isEqualTo([Microsoft.Exchange.WebServices.Data.FolderSchema]::DisplayName,$pfArray[$lint])
            $findFolderResults = $service.FindFolders($tfTargetFolder.Id,$SfSearchFilter,$fvFolderView)
    if ($findFolderResults.TotalCount -gt 0){
        foreach($folder in $findFolderResults.Folders){
            $tfTargetFolder = $folder               
        }
    }
    else{
        "Error Folder Not Found"
        $tfTargetFolder = $null
        break
    }   
}
$Global:findFolder = $tfTargetFolder
}

$dllpath = "C:\Program Files\Microsoft\Exchange\Web Services\2.0\Microsoft.Exchange.WebServices.dll"
[void][Reflection.Assembly]::LoadFile($dllpath)
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1)


$windowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$sidbind = "LDAP://<SID=" + $windowsIdentity.user.Value.ToString() + ">"
$aceuser = [ADSI]$sidbind

$uri=[system.URI] "https://webmail.com/EWS/Exchange.asmx"
$service.Url = $uri

FindTargetFolder($ProcessedFolderPath)

$folderid = new-object  Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$MailboxName)
$InboxFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)
$Sfsub = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::Subject,$Subject[0])
$sfCollection = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::And);
$sfCollection.add($Sfsub)
$sfCollection.add($Sfha)
$view = new-object Microsoft.Exchange.WebServices.Data.ItemView(2000)
$frFolderResult = $InboxFolder.FindItems($sfCollection,$view)

foreach ($miMailItems in $frFolderResult.Items)
 {
$miMailItems.body.text | set-content C:\temp
 }

【问题讨论】:

  • 您是要保存整个电子邮件(包括邮件标题中的所有内容),还是只保存正文?
  • 只需电子邮件的正文即可。保留格式无关紧要,除了换行符。

标签: powershell exchangewebservices


【解决方案1】:

使用其他脚本中的 foreach 循环:

foreach ($miMailItems in $frFolderResult.Items)
 {
  $miMailItems.body.text | set-content <filepath>
 }

您需要为输出文件提出一个文件命名方案,但是将电子邮件正文文本输出到一个文件相对来说是微不足道的。

【讨论】:

  • 谢谢!我到底把这个放在哪里?代替我目前从第一个“foreach”或第二个“foreach”中获得的东西?还是两者兼而有之?
  • 这应该替换他们两个。您在另一个脚本中嵌套了 foreach 循环,因为每封电子邮件可能有多个附件。在这里你只需要一个,因为只有一个身体。
  • 我已将上面的脚本添加到原始帖子中,运行脚本时出现以下错误:50 char:147 无法索引到空数组。 52 字符:18 使用“1”参数调用“添加”的异常:“值不能为空。54 字符:41 使用“2”参数调用“FindItems”的异常:“请求模式验证失败:命名空间“schemas.microsoft.com/exchange/services/2006/types”中的元素“和”内容不完整。预期的可能元素列表:命名空间“schemas.microsoft.com/exchange/services/2006/types'”中的“SearchExpression”。”
  • 我认为这是由 $Sfha 为空造成的。
  • 我现在没有 Exchange 服务器可以运行它,而且已经晚了。如果你到时候还没弄明白,我明天去看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
相关资源
最近更新 更多