# OutlookのCOM操作(PowerShellから)

# Outlook のインスタンス取得

既に Outlook 起動している前提で操作する。
Excel のように別プロセスとして上げる感じだとハマりそうな気がしたため。

$outlookProcess = Get-Process -Name 'Outlook' -ErrorAction SilentlyContinue

if (! $outlookProcess) {
    Write-Host "Outlook 起動してください"
    exit
}

$outlook = New-Object -ComObject Outlook.Application

# COM オブジェクトの解放

こう呼ぶらしいが、エラーになるので呼んでない。
(順番の問題だったかも。それ以上 試してない)

$outlook = null
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($outlook)

# Inbox フォルダ内の操作

Inbox/テスト1 というフォルダを操作するとして

$olFolderInbox = [Microsoft.Office.Interop.Outloook.OlDefaultFolders]::olFolderInbox
$folder = $outlook.Session.GetDefaultFolder($olFolderInbox)
$folder = $folder.Folders('テスト1')

# フォルダの作成

$folder.Folders().Add('フォルダ名')

# フォルダの一覧を辿る

フォルダ内のフォルダの一覧.. を辿る

$outlook.Session.Folders

# 自分のメールアドレスを取得

$outlook.Session.Accounts.Item(1).SmtpAddress

# メールの操作

とある日時より前のメールを削除するとして

$dt = [System.DateTime]::Parse('2010/01/01 00:00:00')
$oldMails = $folder.Items| Where-Object { [System.DateTime]::Parse($_.SentOn.DateTime) -lt $dt }

foreach ($mail in $oldMails) {
    $mail.Delete
}

# 振り分けルール

# ルールの一覧

$rules = $outlook.Session.DefaultStore.GetRules()

# ルールの参照

こんな感じで一覧を標準出力に出して、ちまちまと調べる

$rules| Foreach-Object {
    $rule = $_
    $rule
    $rule.Actions| Where-Object { $_.Enabled }
}
メンバ 説明
$rule.Actions 移動なのか通知するのか etc
$rule.Conditions アドレスが XX のときに適用 etc
$rule.Exceptions 件名が XX のときは除く etc

設定値は数字(enum?) で入っているので、
設定値の意味はドキュメントから見る。

https://docs.microsoft.com/ja-jp/office/vba/api/outlook.olruletype (opens new window)

よく使いそうな値
('#' 以降に書いてあるのは、いっしょに設定するメンバ)

  • OlRuleType
    • 0 : olRuleReceive
    • 1 : olRuleSend
  • OlRuleActionType
    • 1 : olRuleActionMoveToFolder # Folder
    • 5 : olRuleActionCopyToFolder # Folder
    • 23 : olRuleActionNewItemAlert # Text
    • 27 : olRuleActionCcMessage # Recipients
    • 2 : olRuleActionAssignToCategory # Categories
  • OlRuleConditionType
    • 17 : olConditionSenderAddress # Address
    • 2 : olConditionSubject # Text
    • 6 : olConditionImportance # Importance
    • 16 : olConditionRecipientAddress # Address
    • 10 : olConditionToOrCc # パラメータなし
  • OlImportance
    • 2 : olImportanceHigh

# ルールの削除

$rules.Remove($name)

たしか、うしろから消さないとうまくいかないのだった

for ($i = [int]$rules.Count; $i -ge 1; $i--) {
    $name = $rules[$i].Name
    if ($name.StartsWith($prefix)) {
        $rules.Remove($name)
    }
}

# ルールの作成

# 流れ

# 種類: 受信時ルール(olRuleReceive) or 送信時ルール (olRuleSend)
$ruleType = [Microsoft.Office.Interop.Outlook.OlRuleType]::olRuleReceive

# 作成
$rule = $rules.Create('ルール名', $ruleType)

# 表示順: デフォルトは上に追加される。下に追加したい場合こう
$rule.ExecutionOrder = $rules.Count

# 設定: Action, Conditions, Exceptions の設定、有効化
...
$rule.Actions.CopyToFolder.Enabled = $true

# 反映
$rule.Save()

# Action の設定

Action 設定項目 意味
CopyToFolder Folder 指定したフォルダにコピー
MoveToFolder Folder 指定したフォルダに移動
NewItemAlert Text 通知メッセージを出す
DesktopAlert - 通知(右下に出るやつ)を出す
Cc Recipients Cc に追加(送信時ルール)
AssignToCategories Categories 分類の設定(色をつける)
MarkRead - 既読にする。設定できなさそう

(1) フォルダへ移動/コピーするルール (CopyToFolder, MoveToFolder)

  • Folder は直接設定できなかった
$action = $rule.Actions.CopyToFolder

[Micrrosoft.Office.Interop.Outlook.MoveOrCopyRuleAction].InvokeMember(
    'Folder'
    [Reflection.BindingFlags]::SetProperty,
    $null,
    $action,
    $oTargetFolder
)
$action.Enabled = $true

(2) 通知メッセージ (NewItemAlert)

$action = $rule.Actions.NewItemAlert
$action.Text = 'エラーメールきたよー'
$action.Enabled = $true

(3) Cc に追加 (Cc)

  • Recipients 設定はお作法がある
$action = $rule.Actions.Cc
$action.Recipients.Add('test1@xxx.xxx')
$action.Recipients.ResolveAll()
$action.Enabled = $true

(4) 分類の設定 (AssignToCategories)

$action = $rule.Actions.AssignToCategories
$action.Categories = @('分類項目 赤')
$action.Enabled = $true

# Conditions の設定

Condition/Exceptions 設定項目 意味
Subject Text 件名に特定の文字列を含む
Body Text 本文に特定の文字列を含む
SenderAddress Address 送信者が特定の文字列を含む
RecipientAddress Address 受信者が特定の文字列を含む
Importance Importance 重要度が高/中/低
ToOrCc - To/Cc に自分のアドレスを含む

(1) 件名/本文 (Subject/Body)

$conditions = $rule.Conditions.Subject
$conditions.Text = @('パターン1', 'パターン2')
$conditions.Enabled = $true

(2) 宛先系 (SenderAddress/RecipientAddress)

  • Address は、Recipient と異なり、文字列の配列を渡すだけ
$conditions = $rule.Conditions.SenderAddress
$conditions.Text = @('user1@...', 'user2@...')
$conditions.Enabled = $true

(3) 重要度 (Importance)

  • 2: High, 1: Normal, 0: Low
$conditions = $rule.Conditions.SenderAddress
$conditions.Importance = [Microsoft.Office.Interop.Outlook.OlImportance]::olImportanceHigh # = 2
$conditions.Enabled = $true

# Exceptions の設定

Conditions と同様

$exceptions = $rule.Exceptions.SenderAddress
..
$exceptions.Enabled = $true

[ 📩 ご意見 ]