パソコンスキルの教科書

パソコンスキルの教科書

東京大学大学院卒。博士課程に進学を志すも、担当教授と折が合わず、無職になる。医者を目指すも結局断念。田舎で派遣社員として働く。「スキルがなければ、仕事ももらえない」と悟り、ビジネススキルを学ぶ。プログラミング、英語を学び、一部上場企業へ転職。年間100時間以上の業務効率化を行い、社内講師に抜擢。海外の案件を担当し、数億円のプロジェクトに携わる。個人の事業でも、月売上100万を達成。現在は、自分の価値を高めるためのスキル向上支援を行う

PythonでOutlookメール取得しエクセルに一覧し添付ファイルを自動保管|win32comで制御

f:id:gene320:20190430024358j:plain

Pythonを使うとOutlook(アウトルック)のデータを読み込んで、結果を出力したりできます。

そこで、Pythonを使ってOutlookのデータを読み込み、そのデータをエクセルに出力するプログラムを紹介します。

●この記事で分かること

・PythonでOutlookのデータを読み込み、エクセルに一覧にする

・Outlookメール受信日が指定した日付の範囲内のときに限り、処理を行う

・Outlookメールに添付されたファイルを所定フォルダに自動保管する

それでは以下で詳しく紹介していきます。

OutlookのデータをPythonで処理するプログラムの概要

この記事では、Pythonを使ってOutlookメールの情報をエクセルに出力するプログラムを解説します。

目指すことは以下です。

●この記事で紹介するOutlook制御のPythonプログラム

Outlook制御1|Outlookのデータを読み込み、メール内容をエクセルに一覧にする

Outlook制御2|指定した日付の範囲内のメールのみを対象にする

Outlook制御3|指定した日付の範囲内のメールに添付ファイルがある場合、その添付ファイルを所定フォルダに自動保管する

この記事で紹介するプログラムを実行すると、以下のようなプログラムを得ることができます。

Outlook制御1|Outlookのデータを読み込み、メール内容をエクセルに一覧にする

f:id:gene320:20190430014644j:plain

●取得するOutlookのデータ

A列|取得したメールNo
B列|メール件名
C列|メールの受信日時
D列|メール送信元(送信者)
E列|メールの本文(最初の100文字)
F列|添付資料の有無

Outlook制御2|指定した日付の範囲内のメールのみを対象にする

f:id:gene320:20190430015026j:plain

ここでは、2019/4/1~2019/4/30までに受信したメールを一覧にするプログラムを想定している。

Outlook制御3|指定した日付の範囲内のメールに添付ファイルがある場合、その添付ファイルを所定フォルダに自動保管する

f:id:gene320:20190430015925j:plain

●添付ファイルの保管に関する補足

補足1|フォルダ名は「メール受信日」
補足2|一つのメールに複数の添付ファイルがある場合、全て取得する

Pythonプログラム|Outlookメール情報をエクセルに一覧し添付ファイルを自動保管(win32com)するコード

#ステップ1|ライブラリ
from openpyxl import load_workbook
import win32com.client
import datetime
import os

#ステップ2|所定フォルダ内の「Book1.xlsm」を指定して読み込む
filepath = 'C:/Users/---/Outlook_Book1.xlsx'
wb = load_workbook(filename=filepath)
ws1 = wb['データ']

#ステップ3|集計範囲の取得
startdate=ws1['B2'].value
enddate=ws1['B3'].value

#ステップ4|Outlookの情報を取得
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages=inbox.Items

#ステップ5|Outlookのt添付ファイル保管用フォルダの作成
now=datetime.datetime.now()
foldermake=now.strftime("%Y/%m/%d %H:%M:%S")
foldermake = foldermake.replace("/","-")
foldermake = foldermake.replace(":","-")
foldermake = foldermake.replace(" ","-")
newfolder_path = 'C:/Users/---/Outlook_'+foldermake
os.makedirs(newfolder_path)

#ステップ6|Outlookの情報を取得
a=0
for message in messages:
    RT=message.ReceivedTime
    hiduketime = datetime.datetime(RT.year ,RT.month, RT.day, RT.hour, RT.minute, RT.second)
    if startdate <= hiduketime <= enddate:    
        ws1.cell(row=7+a, column=1).value = a+1
        ws1.cell(row=7+a, column=2).value = str(message.Subject)
        ws1.cell(row=7+a, column=3).value = hiduketime
        ws1.cell(row=7+a, column=4).value = str(message.Sender)
        ws1.cell(row=7+a, column=5).value = str(message.body[0:100])
        if message.Attachments.Count > 0:
            myDate = RT.strftime("%Y/%m/%d %H:%M:%S")
            myDate = myDate.replace("/","-")
            myDate = myDate.replace(":","-")
            myDate = myDate.replace(" ","-")
            datefolder_path = newfolder_path + '\\' + myDate
            os.makedirs(datefolder_path)
            for myAttachment in message.Attachments:
                print(myAttachment.FileName)
                myAttachment.SaveAsFile(datefolder_path + '\\' + myAttachment.FileName)
            ws1.cell(row=7+a, column=6).value = '有'
        else:
            ws1.cell(row=7+a, column=6).value = '無'
        a=a+1

#ステップ7|「Outlook_Book2.xlsx」として所定のフォルダに保存する
newfilepath = 'C:/Users/---/Outlook_Book2.xlsx'
wb.save(newfilepath)
print('保存しました')

Pythonプログラムを使うときの注意点

この記事で紹介しているプログラムを使うときの注意点を以下に記載しておきます。

注意点1|エクセルを準備しておくこと

このプログラムでは、エクセルを自動生成するように設定していません。

そのため、以下のエクセルをあらかじめ準備しておく必要があります。

f:id:gene320:20190430022619j:plain

●あらかじめ準備しておくこと

準備1|ファイル名を「Outlook_Book1.xlsx」としておく
準備2|シート名を「データ」としておく

なお、上記のプログラムでは、エクセルの7行目以降に情報は書き込まれていきます。

そのため、以下のrow=7+aの7を書きかえることで、書き込む行を変更することができます。

36. ws1.cell(row=7+a, column=1).value = a+1
37. ws1.cell(row=7+a, column=2).value = str(message.Subject)
38. ws1.cell(row=7+a, column=3).value = hiduketime
39. ws1.cell(row=7+a, column=4).value = str(message.Sender)
40. ws1.cell(row=7+a, column=5).value = str(message.body[0:100])

注意点2|セルB2とB3に集計開始と集計終了日を「yyyy/mm/dd」で入れ込んでおくこと

f:id:gene320:20190430023204j:plain

注意点3|ファイルパスを書き換える

8. filepath = 'C:/Users/---/Outlook_Book1.xlsx'

27. newfolder_path = 'C:/Users/---/Outlook_'+foldermake

57. newfilepath = 'C:/Users/---/Outlook_Book2.xlsx'

上記のプログラムは、開きたいファイルや保存したいファイルパスに応じて、書き換える必要があります。

注意点4|ライブラリを取得しておくこと

2. from openpyxl import load_workbook
3. import win32com.client

上記の2つはライブラリをインストールしておく必要があります。

ライブラリの読み込みはこちら(外部サイト)の記事を読むと分かりやすいです。

PythonがインストールされているPCであれば、以下のコードをコマンドプロンプトで入力し、EnterをおせばOpenpyxlを使えるようになります。

pip install openpyxl
pip install pypiwin32

これらの注意点を押さえないと、プログラムが正しく機能しないことがあります。

上記のサンプルコードを活用して、Outlook制御を試してみてください。