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エラーとか色々な例外が出て途中で止まるので叩く部分は例外処理してリトライとか付けないと放置で大量削除とかは出来ない。

(14)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

avif2png ー AVIF形式画像をPNG形式に変換するアプリ Windows版

最近増えてきたAVIF形式を従来のPNGに変換するWindowsツールです。 インストール不要、完全フリー、広告無しです。

DL

最低限の機能だけ実装してあるので以下の通り確認して下さい。

ZIPファイルの中にavif2png.exeがあります、変換したいファイルをドラッグして実行すると自動で変換します。

対応するファイルはAVIFファイルを含むZipアーカイブと、直接のAVIFファイルで複数のファイルの一括処理に対応します。

変換後のファイル名は元のファイル名の最後に.pngが付いたPNG画像です。 ※既存のファイルは有無を言わさず上書きされます

機能要望、バグレポートなどはコメント欄からどうぞ。 興味のある広告を踏む支援や、Amazonギフトのカンパ歓迎します。 コメント欄は自動表示では無いのでギフトコードなど投げ込んで貰ってもOKです。

(712)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

Windows環境でVENVなPythonを実行するバッチ

Windows環境でvenvを使ったPythonプログラムを直接起動したかったのでバッチを記述。

Pythonプロジェクトディレクトリベースだと・・・

activateはcallで実行する。 普通に実行するとactivateが終わる(venvを抜ける)まで次に遷移しないので。 callすれば次のpythonコマンドはvenv内で実行される。

(931)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

Python3での並列処理実装について

 最近は専らPythonがマイブーム、シンプルで書きやすく、色々な環境で動かせて、パワー不足ならCythonを使ったり他言語でモジュール化して組み合わせたりと簡単に出来ます。 最近ではPCパワーがあるので余程ヘビーなことじゃなければPythonオンリーでこなせるし、ちょっとした事なら並列化対応も出来ます。 で、今回は並列実装の話を書いておきます。

続きを読む

(465)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

Windows10で「バッテリ切れの動作」を「何もしない」に変更する方法

 Windows10でバッテリ動作時にバッテリ切れになると自動でスリープか休止状態かシャットダウンになっちゃう動作。 電源設定上ではバッテリ切れレベルは3%までしか下げられず、バッテリ動作時には「何もしない」が選べないんだけど、Lenovo ThinkPadのVantageでバッテリのリセット時にもこれが動いちゃって上手くリセットできなくなっていた。

続きを読む

(1012)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

Flask, uWSGI, nginxでLet’s Encrypt導入・自動更新

FlaskをuWSGIで動かしてnginxリバースプロキシで繋いでついでに無料SSLのLet’s Encryptを自動更新するメモ。

続きを読む

(483)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

MySQLでTRUNCATEは必要だった

 開発環境のデカイデータが入ったMySQLのInnoDBテーブルをまるごと削除した。
 TRUNCATEはSQL:2008で標準になった割と新しいヤツなので、ORMで直接関数呼び出しになって互換性無しなんで、DELETEで削除してみたんだけど、削除済みテーブルの挙動がアレ?だった。

続きを読む

(135)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ