【问题标题】:Export or Print Outlook Emails to PDF将 Outlook 电子邮件导出或打印为 PDF
【发布时间】:2017-08-22 01:43:52
【问题描述】:

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

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

没有将所有电子邮件保存到临时文件并使用第三方方法,是否有可以传递给 PrintOut 的参数?或者其他方式来实现这一点?

这是获取电子邮件的基本代码。我循环浏览 $Emails

$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

【问题讨论】:

  • 我很确定您可以使用 COM 对象将邮件保存到 .msg 文件中。然后,您可以使用MSG2PDFConverter.exe(Office 工具)进行批量 PDF 转换
  • @JPBlanc 我相信这是可能的,但我试图避免下载/转换,因为这会添加更多内容,而不仅仅是单个 PS1 文件供用户运行。
  • 从技术上讲,您也可以从 Outlook COMObject 打印到 PDF,但我希望打印驱动程序需要目标文件名,并且该文件名不容易发送,它取决于 PDF 打印机系统中安装的驱动程序。我会说使用外部批处理转换器。如果批处理转换器一次只接受一个项目,您也可以使用-AsJob 标志来启动它。
  • 您将如何处理这些邮件中的附件?您能指望所有机器上都有像CutePDF 或Adobe 的PDF 打印机这样的pdf 打印机吗? 我在对象中找到了 PrintOut 方法,但它提示输入文件名。 我们可以看到代码 sn-p 吗?我很乐意提供帮助,但我不想为了测试这一点而重新创建整个解决方案。
  • PrintOut 似乎没有给你太多的工作。

标签: powershell pdf outlook


【解决方案1】:

貌似没有内置方法,但如果你愿意使用第三方二进制,可以使用wkhtmltopdf

  1. 获取precompiled binary(使用 MinGW 32 位以获得最大兼容性)。
  2. 使用 7Zip 安装或解压安装程序并将wkhtmltopdf.exe 复制到您的脚本目录。它没有外部依赖,并且可以随您的脚本重新分发,因此您不必在所有 PC 上安装 PDF 打印机。
  3. 在您的脚本中使用MailItem 对象的HTMLBody 属性进行PDF 转换。

这是一个例子:

# 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 来获取对象的相关属性,因此代码可能需要一些调整。

【讨论】:

  • 不是我所希望的,但看起来是唯一真正的选择。
【解决方案2】:

有同样的问题。如果其他人试图做类似的事情,我就是这样做的。

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

$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()
 }

然后,清理完不需要的文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2015-05-02
    • 2019-04-20
    • 2020-11-21
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多