【Excelをメール検索GUIとして使う02】PowerShellでOutlookのメールアイテム一覧をcsvで吐いてPowerQueryに食わせる

前回のこれに手を加えた

https://qiita.com/taleau/items/b1ac96ef05b1321bb5d1

- 送信BOXの巡回を追加
- 添付ファイル名一覧の取得を追加
- `受信者名 = $oItem.To`にプロパティを変更


## 説明
###  送信BOXの巡回を追加
よく使われる定数は以下の通り

|**定数**|**値**|**内容**|
|---|---|---|
|olFolderInbox|6|受信トレイ|
|olFolderSentMail|5|送信済みトレイ|
|olFolderDeletedItems|3|削除済みトレイ|
|olFolderDrafts|16|下書き|
|olFolderJunk|23|迷惑メール|

フォルダIndexの配列を作成しておき、
``` powershell
$arr_oFolders = @(5,6)
```

配列の要素を 1 つずつ $oFolder に格納してループする枠を前回のコードの１つ外に追加
``` powershell
# $ary_namesの要素を 1 つずつ $oFolder に格納してループする
for($fld = 0; $fld -lt $arr_oFolders.Count; $fld++){
    $oFolder = $oNamespace.GetDefaultFolder($arr_oFolders[$fld])
```

### 添付ファイル名一覧の取得を追加
前回、`$oItem.Attachments.Count`（添付ファイル数）をそのままCSVの[添付ファイル数]列に打ち込んでいたのを
`$oItem.Attachments`内のアイテム巡回してファイル名を文字列に加筆していく前処理を追加した。

```
# 添付ファイルリストを取得
$attList=""
foreach($att in $oItem.Attachments){
      $attList += ";" + $att.FileName
}
```


### `受信者名 = $oItem.To`にプロパティを変更
`ReceivedByName`だと自分以外が空白になっていたので`To`に変更した。

## コード
``` powershell
# Outlookのフォルダからメール一覧を作成、CSVに吐き出す

# 参考（Outlook取得）：https://www.itlab51.com/?p=6171
# 参考（CSV出力）：https://use-computer.net/powershell/powershell-course-5
# 参考（列挙型）：https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_enum?view=powershell-7.2


$oOutlook = New-Object -ComObject Outlook.Application
$oNamespace = $oOutlook.GetNamespace("MAPI")


# フォルダIndexの配列を作成
$arr_oFolders = @(5,6)
#$olFolderInbox = 6 #受信トレイ
#$olFolderSentMail = 5 #送信済みトレイ

# ループ回数の上限を設定（CSVに書き出すメール数）
$LimLoopCnt=10000

# 取得する文字数に制限をかける
$LimLenStr=10000                

# 変数の初期化
$CsvData = @()
$rr=0
 
# $ary_namesの要素を 1 つずつ $oFolder に格納してループする
for($fld = 0; $fld -lt $arr_oFolders.Count; $fld++){
    $oFolder = $oNamespace.GetDefaultFolder($arr_oFolders[$fld])

    # $oFolder内の全アイテムを巡回して1レコードずつCSV出力用の変数に格納していく
    foreach($oItem in $oFolder.Items){
            # 取得する文字数に制限をかける（文字数が多すぎるとセルをはみ出してテーブル構造が崩れるため）
            $Str = $oItem.Body
            $LenStr = ($oItem.Body).Length
            if ( $LenStr -gt $LimLenStr)
                {$Str = $Str.Substring(0,$LimLenStr)}
            
            # 添付ファイルリストを取得
            $attList=""
            foreach($att in $oItem.Attachments){
                $attList += ";" + $att.FileName
            }
            
            # 1レコードずつCSV用の変数につぎ足していく
            $CsvData += [PSCustomObject]@{
                No = $rr+1 # 0始まりのため出力は1始まりにする
                件名 = $oItem.Subject
                本文 = $Str.Replace("`r`n","") #改行殺し
                受信日時 = $oItem.ReceivedTime
                受信者名  =$oItem.To #ReceivedByNameだと自分以外が空白になる
                送信者名  =$oItem.SenderName
                CC = $oItem.CC
                ConversationID = $oItem.ConversationID
                添付ファイル = $attList

            }

            # ループ脱出
            $rr = $rr + 1
            if( $rr -gt $LimLoopCnt){break}
        }

} 

# CSVに吐き出す
$CsvData | ft -AutoSize
$CsvData | Export-Csv "ol_受信BOX_Itmes.csv" -Encoding Default
```

## 残課題
### Accessに食わせてみたい
今のCSVそのままだと文字化けとかテーブルでない1行目の余計な文字列が邪魔で素直にインポートできない。
そもそもAccessで扱うべきかもわからないが。。。

### 選択レコードをフォームに表示したい
これはまだ。
Accessのフォームの方がExcelユーザーフォームよりも作り方が楽なのでAccessでできるならそっちやりたい。

こういうこともあるし、テーブル構成がまだ変わるかもなので表現方法は最後でいい。