適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話など気になったことも載せているブログです。

【PowerShell】Outlookの受信トレイのメールを取得する

はじめに

Outlook関連の設定をPowerShellで自動化する必要があったため、そのときに調べた内容の備忘録です。

主にPowerShellでOutlookの処理を自動化する場合のとっかかりとして、

また、受信トレイのメールを取得するという少し実践的な例を記載しております。

PowerShellから操作する利点として簡単にコマンドが実行できるので、

少しずつ実際にコマンドを試しながら調べることができました。

一部眉唾な表現もありますが、読んで頂けるようでしたら実際にコマンドを試しながらお読み頂くことをお勧めします。

また、この記事では主にOutlookをPowerShellで操作するところに主眼をおいているため、

PowerShellの文法などについては特に振れておりませんのであしからず。

環境

Outlook 2019

OutlookをPowerShellから操作するためには

まず、OutlookをPowerShellから操作するためには、

Microsoftが用意してくれている、COMというインターフェースを使用します。

PowerShell側のイメージとしてはCOMの新しいオブジェクトを作成し、

そのオブジェクトのメソッドやプロパティを呼び出すことで、やりたい操作を実現するといった感じになります。

Outlookがインストールされ、設定済みのPCであればPowerShellで下記の通り実行することで

OutlookのCOMオブジェクトを作成することができます。

 
$outlook=New-Object -ComObject Outlook.Application

試しにGet-Memberコマンドレットにパイプしてあげるとメソッドやプロパティの一覧を確認することができます。

 
$outlook|Get-Member

実際に打ち込んでみるとたくさんのメソッドやプロパティが表示されたかと思います。

あとは、このオブジェクトを通して煮るなり焼くなりしていきます。

Outlook関連のオブジェクトについて

とはいったものの、Get-Memberで見てみるとわかりますが、

OutlookのCOMオブジェクトには大量のメソッドやプロパティが存在します。

これではどこから手をつけていいのかイマイチわかりません。

そのため、ひとつのとっかかりとして、Outlookの連絡先を操作する際に

私が脳内でイメージしているOutlookの構造を簡単に触れておこうと思います。

下記のような階層構造を持ったフォルダというイメージです。

--------------------------------------
Outlook.Application
       |
     Session
            |-送信トレイフォルダ(4)
            |-受信トレイフォルダ(6)
            |-予定表フォルダ(9)
            |-連絡先フォルダ(10)
            |-メモフォルダ(12)
            |-タスクフォルダ(13)
            |-下書きフォルダ(16)
            |-To Doフォルダ(28)
---------------------------------------

まず、頂点にはOutlook.Applicationというものがあり、

その下にSession、さらにその配下によく目にするであろう、

受信トレイや連絡先フォルダがあるという感じです。

PowerShellから操作する際はOutlook.Application、Sessionという順番でインスタンス化していき、

最後にこの各フォルダをインスタンス化することで、そのインスタンス化したオブジェクトに対して操作をするイメージです。

ちなみにフォルダ横のカッコ内の数字はそのフォルダを指定する際の定数です。これについては後述します。

これらのフォルダの中には、さらに別のフォルダが入って深い層になっている場合もあれば、直接アイテムが入っている場合もあります。

例えば受信トレイフォルダであれば、自分で作成したフォルダがその中にあることもありますし、

受信トレイにメール=アイテムが入っていることもあるといった具合です。

階層構造になっているところはWindowsのファイルシステムと同じですね。

上の図で書いてあるフォルダはOutlookにデフォルトで用意されているフォルダであり、各フォルダには定数が割り当てられています。

フォルダ名の右側のカッコ内の数字です。

実際にPowerShellからこれらのフォルダにアクセスする際には、その定数を指定してアクセスします。

例えば9は予定表。16は下書きフォルダ。連絡先は10となります。

詳しくはMicrosoftのサイトに一覧がありますのでurlを貼っておきます。

OlDefaultFolders 列挙 (Outlook) | Microsoft Learn

受信トレイのデータをPowerShellから覗いてみる

説明だけではいまいちわかりづらいのでPowerShellを使って受信トレイフォルダにアクセスする例を示します。

先ほど触れたように、Outlook.Application、Sessionとインスタンス化していき、$inbox変数に受信トレイを割当ています。

 
$outlook=New-Object -ComObject Outlook.Application
$session=$outlook.Session
$inbox=$session.GetDefaultFolder(6)

これらを参考にもう少し実践的なサンプルを載せておきます。

受信トレイ内のメールタイトルを一覧にする

例えば、受信トレイ内のタイトルだけを一覧にする場合は、foreachを使うことで実現できます。

 
$outlook=New-Object -ComObject Outlook.Application
$session=$outlook.Session
$inbox=$session.GetDefaultFolder(6)
foreach ($item in $inbox.Items){
    $item.Subject
}

自分が操作したいフォルダをGetDefaultFolderメソッドで指定し、

その中のオブジェクトに対して操作をする、そんなイメージになります。

受信トレイ内のメールアイテムはMailItem オブジェクトになります。

上記のスクリプトでは$item変数が該当します。

MailItem オブジェクトは1つ1つのメールを表し、

メールに欠かせない宛先(To)、送信者(Sender)、件名(Subject)、本文(Body)、添付ファイル(Attachments)といったプロパティがあります。

MailItem オブジェクトについて詳しく知りたい方はMSDNのドキュメントをご覧ください。

MailItem オブジェクト (Outlook) | Microsoft Learn

ここでは簡単な使い方にとどめておきます。

受信トレイのメールの中で添付ファイルがあるものだけを一覧にする

もう少し操作のイメージを持ってもらうための例として、 添付ファイルがあるメールのタイトルと添付ファイルの数を一覧にする例を紹介します。

 
$outlook=New-Object -ComObject Outlook.Application
$session=$outlook.Session
$inbox=$session.GetDefaultFolder(6)
foreach ($item in $inbox.Items){
    if($item.Attachments.Count -gt 0){
        '{0}({1})' -f $item.Subject,$item.Attachments.Count
    }
}

受信トレイのメールをCSVにする

最後に受信トレイのメールをCSV形式にして保存する例を紹介します。

 
$outlook=New-Object -ComObject Outlook.Application
$session=$outlook.Session
$inbox=$session.GetDefaultFolder(6)
$mails=@()
foreach ($item in $inbox.Items){
    $mails+=[PSCustomObject]@{
        "Sender"= $item.Sender.Address
        "CC"= $item.CC.Address
        "BCC"=$item.BCC.Address
        "Subject"=$item.Subject
        "Body"=$item.Body
    }
}
$mails|Export-Csv -Path 'C:\mail.csv' -NoTypeInformation -Encoding Default

上記のコードを実行すると、Cドライブの直下にmail.csvというファイルが作成されます。

PowerShellを使えば、作成したオブジェクトをCSV形式だけではなく、

XML、Jsonといったメジャーなデータ交換形式に比較的簡単に変換できるメリットがあります。

www.tekizai.net

Outlookのリファレンスについて

OutlookのリファレンスはMicrosoftの公式ドキュメントが詳しいです。

しかしこの記事執筆時点、リファレンスはVBAやC#で書かれているため

PowerShellの参考にするときは少し読み替えが必要になります。

しかしサンプルが充実しているため、Outlookの自動化を考えている方は

自分の興味のあるところだけでも一読することをおすすめします。

Outlook Visual Basic for Applications (VBA) リファレンス | Microsoft Learn

終わりに

OutlookのPowerShellでの触り方全般そして、

受信トレイのメールを参照する際の例についてつらつら述べてまいりました。

冒頭にも述べましたが、PowerShellを使うことで

少しずつコードを試しながらコーディングできるので

Outlookの操作を自動化する際の

とっかかりとしてはとてもいいのかなと個人的に思っております。

以上、ここまでお読みいただき、ありがとうございました。