Python – pywin32でOutlook整理

outlookのメールボックスがゴミだらけになってるけど標準の検索やフィルタ機能で削除するのは結構痒いところに手が届かなかったりするのでPython利用で削除してみた。

まず、outlookを制御する場合、Win32 COMを経由して制御することになり、Windows版Pythonインストール時に入れられるpywin32ライブラリでコレが出来る。

import win32com

pywin32にはWindowsの色々にアクセス出来るけど今回はCOMだけなのでコレで。

outlookにアクセスする基本形は

outlookがアプリケーションアクセス用で、ネットでさらったコードだとDispatchを使ってたけど、今回は処理をする時にイベント処理が必要なのでWithEventsを使ってる。 mapiはメールボックスとかの各種情報にアクセスするネームスペース。

この辺までは大体既存の情報検索とMSのドキュメントですんなり行ったんだけど、completeの所がちょいと手間取った。 AdvancedSearchしてすぐにsearchにアクセスしても、その先はoutlookなので実態じゃなくてoutlookのインスタンスで検索が終わってないと0件だったり、件数があっても処理してる間にどんどん増えていったりするので、検索が完了するまで待機する必要がある(AdvancedSearchは結果を返してるわけじゃなく、AdvancedSearchを開始してソコへの繋ぎを即座に返している)
 で、MSのVBA Learnとかを見るとAdvancedSearchが完了するとAdvancedSearchCompleteイベントが発生するよ、って言うのはあったけど、その時のハンドラをPythonからアクセスするのがイマイチ良くわからず、VBAサンプルだとApplication_AdvancedSearchCompleteとか書いてたけど、どうやってアクセスするんだろと。 で、色々なCOMアクセスのサンプルとかを漁っていった結果、多分こうじゃないかな?と色々な名称を書いていった結果・・・

コレが正解だった、global使ってるのは格好悪いけどハンドラインスタンスにアクセスする方法が良くわからずだったのでコレで妥協。 importの下でcomplete = Falseでcompleteを定義してグローバルアクセスしてる。

ネーミングルールがわかればまぁ後は簡単ですね、Onイベント名と言うメソッドを持ったハンドラー用クラスを作ってWithEventsの第二引数に入れてやればOKと言う簡単な答えだった。 でも、ネット探してもAdvancedSearchComplete使ってるコードがなかったんで案外手間取った、そんなわけでここにナレッジとして記載。

なお、大抵連続処理してるとOLEエラーとか色々な例外が出て途中で止まるので叩く部分は例外処理してリトライとか付けないと放置で大量削除とかは出来ない。

(83)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP]   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です