PowerShell EWS另存为电子邮件

时间:2015-06-09 07:23:37

标签: email powershell exchangewebservices

如何在PowerShell的EWS帮助下将电子邮件保存在磁盘上?我在互联网上搜索了一些answers,但这些都是针对C#或VB的。

我现在所拥有的代码可以完成我需要的一切,将电子邮件复制到MS Outlook中的正确文件夹等等,但我似乎无法弄清楚如何将邮件保存在文件夹中({ {1}})在磁盘上。

这可以采用EML或MSG格式,对我来说并不重要,但需要保存它所拥有的一切(正文,附件,From,To,..)。

我已经尝试了$ENV:Temp,它确实生成了一个15 KB的文件,但是当我用MS Outlook打开它时,它似乎是空的。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

与此同时,我找到了解决方案:

$Service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService -ArgumentList $ExchangeVersion
$Service.Credentials = $Credentials.GetNetworkCredential()
$Service.AutodiscoverUrl($BNLMailbox)

Try {
    $PowerShellPathId = Find-MailFolderIDHC @FindMailParams -Path $BNLMailboxInbox
    $Inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($Service,$PowerShellPathId)
}
Catch {
    # Exchange version not correct or path not found
    throw "Move-MailsHC $($Global:Error[0].Exception.Message)"
}

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

$Date = [Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeReceived
$TimeSpan = (Get-Date).AddHours(-$HoursAgo)
$Filter = New-Object -TypeName Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThan -ArgumentList $Date,$TimeSpan

$View =  New-Object Microsoft.Exchange.WebServices.Data.ItemView(100)
$View.OrderBy.add([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeReceived,
    [Microsoft.Exchange.WebServices.Data.SortDirection]::Ascending)

 foreach ($Mail in $Mails.Items) {
    $TmpFolder = Join-Path $env:TEMP 'Move-MailsHC'
    if (-not(Test-Path $TmpFolder)) {
        New-Item $TmpFolder -ItemType Directory | Out-Null
    }
    Write-Verbose "Save original e-mail in temp '$TmpFolder'"
    $TmpMail = Join-Path $TmpFolder 'Mail.eml'
    $IoFile = New-Object System.IO.FileStream($TmpMail, [System.IO.FileMode]::Create) 
    $IoFile.Write($Mail.MimeContent.Content, 0, $Mail.MimeContent.Content.Length)
    $IoFile.Close()

    Write-Verbose "Download e-mail attachments to temp '$TmpFolder'"
    foreach ($A in $Mail.Attachments){
        $A.Load()
        $fiFile = New-Object System.IO.FileStream((Join-Path $TmpFolder $A.Name.ToString()), [System.IO.FileMode]::Create)
        $fiFile.Write($A.Content, 0, $A.Content.Length)
        $fiFile.Close()
        Write-Verbose "Downloaded Attachment: $($A.Name.ToString())"
    }
}