web-dev-qa-db-ja.com

PowershellスクリプトからOutlook電子メールメッセージの本文にアクセスするにはどうすればよいですか?

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)であることがわかります。したがって、ほとんどの電子メールはshould HTMLBodyにコンテンツが含まれています-いずれもありません。件名にはアクセスできますが、コンテンツにはアクセスできません。

オンラインで見つけたすべての例で本文のコンテンツを取得できるように見えるので、件名などをダウンロードするだけのOutlookの設定に違いないと思います。 Enterprise Vaultがあります-コンテンツをメッセージとは別に保存できますか?

4
nickdmax

次のコードを使用して、「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
1
MahmutKarali

MSDNドキュメント に基づくと、これは確かに、オブジェクトモデルガードを介した選択的なプロパティへのアクセスをブロックするアンチウイルスであると思います。これは、$mm.Bodyプロパティは 設定可能ですが取得可能ではありません 。自分のマシンの企業のセキュリティ設定にアクセスできないため、相互運用の方向性をこれ以上追求できませんでした。

いくつかあります 回避策の提案

  • Exchange Webサービス -EWS API(Webサービスの.Netバインディング)を介して利用できます。
  • 拡張MAPI -ネイティブライブラリインターフェイス。
  • 拡張MAPIインターフェイスのサードパーティCOMラッパー。 ( 償還 など)

インターフェースはかなり複雑だと言わざるを得ませんが、私はEWSで作業するつもりだと思います。

@TessellatingHecklerに、私を道に導いてくれてありがとう。

1
nickdmax

ええと、私は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)はそのユーザーの受信ボックスフォルダーを取得するためのものです。これらの値を見つけるのは私にとってすべての試行錯誤です。それはあなたによって異なる可能性があるので、コードをステップバイステップで部分的に実行して、ユーザーの目的のフォルダーを取得します。これがお役に立てば幸いです。

0