【问题标题】:How to access body of Outlook email messages from Powershell script?如何从 Powershell 脚本访问 Outlook 电子邮件的正文?
【发布时间】:2016-11-25 15:25:32
【问题描述】:

我的 Outlook 中有一个基本文件夹,其中包含来自监控系统的警报。我想根据该数据创建一个表。为此,我一直在尝试在 Outlook 中访问电子邮件的正文内容:

Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
$Outlook = New-Object -ComObject Outlook.Application
$namespace = $Outlook.GetNameSpace("MAPI")
$inbox = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)
$inbox.Items | Format-Table BodyFormat, Body, HTMLBody, RTFBody

现在我希望看到一些 Body、HTMLBody 或 RTFBody 的内容——我没有。我确实看到 BodyFormat 通常是 2 (olFormatHTML)。所以大多数电子邮件应该在 HTMLBody 中有内容——它们都没有。我可以访问主题行,但不能访问内容。

由于我在网上找到的每个示例似乎都可以获取正文内容,我认为它必须是 Outlook 中的设置,只能下载主题行或其他内容。我们有 Enterprise Vault——内容可以与邮件分开存储吗?

【问题讨论】:

  • 所以如果我将 $mm 设置为第一条消息$mm=$inbox.items.getfirst(),那么我可以看到$mm.downloadstate 是 1,这应该意味着完全下载。 - 所以我不认为前景只是获得主题行。 $mm.body$mm.HTMLBody 仍然是空的。
  • $mm.GetInspector.EditorType 返回 4 或 (olEditorWord)。但这似乎并没有导致任何地方。我可以设置正文 $mm.body="this is a test" -- 但 $mm.body 仍然为空,但消息显示在 Outlook 中。
  • 在这里为我工作,列出电子邮件正文内容。我觉得您的问题不是 PowerShell,而是您设置中的其他地方。有点,但它可能是一个防病毒/反恶意软件客户端阻止脚本访问 Outlook 吗?有什么方法可以通过 Exchange Web Access(或 Exchange Web 服务)而不是 Outlook 来通过脚本访问邮箱?
  • 我认为你是对的,我认为有一些东西阻塞了 COM 接口 - 但是我找不到有关此类功能的文档。我的另一个理论是版本——当我在没有打开 Outlook 的情况下运行脚本时,然后尝试打开 Outlook,它告诉我“正在运行另一个版本的 Outlook……”所以——也许是我无法访问某些 COM 对象的原因是加载的库 Powershell 比安装的 Outlook 版本新/旧。也许吧。
  • 嗯,大会说版本是 14.0.0.0,应该是 Outlook 2010。为了安全起见,我尝试了 32 位和 64 位 PowerShell 模块。我也尝试以管理员身份运行。没有变化。

标签: email powershell outlook outlook-2010


【解决方案1】:

基于MSDN documentation,我相信这确实是防病毒软件通过对象模型保护阻止了对选择性属性的访问。这就解释了为什么$mm.Body 属性是settable but not gettable。由于我无权访问我机器上的任何公司安全设置,我无法进一步追求互操作方向。

有几个workaround suggestions

我想我将使用 EWS,尽管我不得不说界面相当复杂。

感谢@TessellatingHeckler 为我指明了道路。

【讨论】:

    【解决方案2】:

    使用以下代码,您可以访问名为“mailFolder”的文件中未读邮件的正文。

    $OL=New-Object -ComObject OUTLOOK.APPLICATION
    $ns =$OL.GETNAMESPACE("MAPI")
    [string]$Folder ="mailFolder"
    $mail = $ns.Folders.Item(1).Folders.Item($Folder).Items.Restrict('[UnRead] =   True')
    $mail | Select-Object -Property Body | Format-List
    

    【讨论】:

    • 这对我仍然不起作用。我可以查看主题:$ns.Folders.Item(1).Folders.Item("inbox").Items | Select-Object -Property Subject 但我无法查看电子邮件的正文 - 这是核心问题。我已经放弃了这项任务,因为似乎有安全措施可以防止脚本访问我们系统上的电子邮件内容。我确实考虑过使用 EWS API,但由于界面对于快速脚本来说有点过于复杂,因此工作并没有取得很大进展。
    【解决方案3】:

    好吧,我的 Outlook 中有多个帐户。我稍微定制了 MahmutKarali 先生共享的代码,它对我有用。此外,代码仅在 PowerShell 的非管理员模式下运行。之后,我必须允许在桌面上的 Outlook 应用程序中访问 10 分钟。

    $ol = New-Object -ComObject Outlook.Application
    $ol.Session.Logon("Outlook")
    $ns = $ol.GetNamespace("MAPI")
    $mail = $ns.Folders.Item(3).Folders.Item(2).Items.Restrict('[UnRead] =   True')
    $mail | Select-Object -Property Body | Format-List
    

    这里的 Item(3) 用于从配置文件中获取特定用户,而 Item(2) 用于获取该用户的收件箱文件夹。找到这些值对我来说都是一次尝试和尝试,它可能因您而异,因此只需一步一步地运行代码即可获得用户所需的文件夹。我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多