关于powershell:将Outlook电子邮件导出或打印为PDF

Export or Print Outlook Emails to PDF

我正在使用PowerShell在Outlook中的指定文件夹中循环,并将附件保存在树状结构中。这行之有效,但现在管理层已要求将电子邮件本身也保存为PDF。我在对象中找到了PrintOut方法,但是提示输入文件名。我还无法弄清楚要传递给它的内容以使其自动保存到特定的文件名。我查看了MSDN页面,这对我当前的水平来说有点高。

我正在使用Outlook.application的com对象。

将所有电子邮件保存到临时文件并使用第三方方法的简短操作是否可以将参数传递给PrintOut?还是另一种方式来实现这一目标?

这是获取电子邮件的代码基础。我遍历$ Emails

1
2
3
4
5
6
7
$Outlook = New-Object -comobject outlook.application
$Connection = $Outlook.GetNamespace("MAPI")
#Prompt which folder to process
$Folder = $Connection.PickFolder()
$Outlook_Folder_Path = ($Folder.FullFolderPath).Split("",4)[3]
$BaseFolder += $Outlook_Folder_Path +""
$Emails = $Folder.Items


好像没有内置方法,但是如果您愿意使用第三方二进制文件,则可以使用wkhtmltopdf。

  • 获取预编译的二进制文件(使用MinGW 32位以获得最大兼容性)。
  • 使用7Zip安装或解压缩安装程序,然后将wkhtmltopdf.exe复制到脚本目录。它没有外部依赖性,可以随您的脚本一起重新分发,因此您不必在所有PC上都安装PDF打印机。
  • 在脚本中使用MailItem对象的HTMLBody属性进行PDF转换。
  • 这里是一个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # Get path to wkhtmltopdf.exe
    $ExePath = Join-Path -Path (
        Split-Path -Path $Script:MyInvocation.MyCommand.Path
    ) -ChildPath 'wkhtmltopdf.exe'

    # Set PDF path
    $OutFile = Join-Path -Path 'c:\\path\\to\\emails' -ChildPath ($Email.Subject + '.pdf')

    # Convert HTML string to PDF file
    $ret = $Email.HTMLBody | & $ExePath @('--quiet', '-', $OutFile) 2>&1

    # Check for errors
    if ($LASTEXITCODE) {
        Write-Error $ret
    }

    请注意,我没有使用Outlook的经验,并且使用MSDN来获取对象的相关属性,因此代码可能需要进行一些调整。


    发生了同样的问题。如果有人尝试做类似的事情,这就是我要解决的问题。

    您可以先获取msg文件并将其转换为doc,然后再将doc文件转换为pdf。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $outlook = New-Object -ComObject Outlook.Application
    $word = New-Object -ComObject Word.Application

    Get-ChildItem -Path $folderPath -Filter *.msg? | ForEach-Object {

        $msgFullName = $_.FullName
        $docFullName = $msgFullName -replace '\\.msg$', '.doc'
        $pdfFullName = $msgFullName -replace '\\.msg$', '.pdf'

        $msg = $outlook.CreateItemFromTemplate($msgFullName)
        $msg.SaveAs($docFullName, 4)

        $doc = $word.Documents.Open($docFullName)
        $doc.SaveAs([ref] $pdfFullName, [ref] 17)

        $doc.Close()
     }

    然后,只需清除

    之后不需要的文件