fum125’s diary

IT全般に関する技術メモなど

Outlook2016 を Python から制御してみる (1)

Python3 もインストールしたし、jupyter notebook も使えるようになったので、早速なにか作ってみます。
まずは、Outlook のメールを python から動かしてみましょうか。
(...って、少しハードルが高かったかも...)

win32com が使えるようにする

python から Outlook にアクセスするサンプルなどを調べると、 "import win32com.client" なんてのをやっています。

早速まねてみましたが、ImportError...
win32com は標準では入っていないんですね。

import win32com.client
↓
# ImportError: No module named 'win32com'

どうやら win32com (pywin32) は sourceforge から取ってくるみたい。 https://sourceforge.net/projects/pywin32/
現在最新バージョンである "Build 220" の下に行き、「windows 32bit版 pyhton3.5 用」の pywin32 をダウンロードしてきました。
ファイル名は "pywin32-220.win32-py3.5.exe"。

この入手した exe を実行すると、pywin32 がインストールされ、無事に "import win32com.client" が実行できるようになりました。

(2016.12.08補足)
現在は anaconda-4.2.0を使用していますが、anaconda には最初から win32com が同梱されていました。
sourceforge から入手しなくても、すぐに使用できます。

受信トレイまでたどり着く

Outlook で、デフォルトとして使っている受信トレイにアクセスするには、以下のソースで行けました。

import win32com.client
object = win32com.client.Dispatch('Outlook.Application')
mapi = object.GetNamespace('MAPI')
inbox = mapi.GetDefaultFolder(6)
print(inbox.Name)

# 実行結果
受信トレイ

ところで、GetDefaultFolder() の引数である "6" ってなんでしょね?
調べ見ると、"6" は Outlook の受信トレイフォルダを表していて、OlDefaultFolders 列挙に定義されているようです。

(参考 https://msdn.microsoft.com/ja-jp/vba/outlook-vba/articles/oldefaultfolders-enumeration-outlook )

olFolderInbox を使ってみる

じゃあ、GetDefaultFolder(6) は、GetDefaultFolder(olFolderInbox) と書いてもいいのかな?

やってみました。

inbox = mapi.GetDefaultFolder(win32com.client.constants.olFolderInbox)
↓
AttributeError: olFolderInbox

駄目でした。
olFolderIndex が定義されていないみたいです...

これは、解決方法が分かりました!!

1. Python インストールフォルダ配下の "Lib\site-packages\win32com\client" に移動する。
私の環境では "C:\Python35\Lib\site-packages\win32com\client"。

# cd C:\Python35\Lib\site-packages\win32com\client

2. makepy.py を実行する。

# python makepy.py

3. ダイアログが表示されたら、"Microsoft Outlook XX.X Object Library (X.X)" を選択して [OK] をクリック。
(Ctrlキーを押しながら、複数選択することも可能)
 
f:id:fum125:20180606221307p:plain

4. 端末に "importing module" と表示されたら、python か ipython を起動して、import からやり直してみる。

>>> import win32com.client
>>> object = win32com.client.Dispatch('Outlook.Application')
>>> win32com.client.constants.__dicts__
 :
'olFolderInbox': 6,

これで olFolderInbox が使えるようになりました。

補足 : olFolderIndex が使えるようにするもう1つの方法 (2016.12.08補足)

会社と自宅等の複数のPCに anaconda を入れてみましたが、環境によっては makepy.py を実行しても olFolderIndex が使えないことがありました。
makepy.py は実行できているのですが...。

その際には、たまたまかもしれませんが、以下を実行してみたら上手くいったということがありましたので、メモしておきます。

# ipython
: from win32com.client from makepy
: makepy.main()

ここで、使用したい項目を選択。

この後に表示される "Generating to" のパスが "AppData\Local\Temp\gen_py\3.5\数字.py" となるとうまくいくようでした。
(うまくいかないケースは、ここが __pycache__ となっていたような気が...。まだpythonの仕組みがよく理解できていないので、うろ覚えです)