以前、本連載でGmailを受信するプログラムを紹介した。今回は、受信したメールを解析して、誰が一番多くメールをくれたのかを調べるプログラムを作ってみよう。日々、受信するメールをどのように活用できるのか?のヒントにもなるだろう。

  • 誰から一番多くメールをもらっているのか調べるプログラムを作ってみよう!

    誰から一番多くメールをもらっているのか調べるプログラムを作ってみよう!

PythonでGmailを受信する方法

普段どのクライアントを利用してメールのやりとりをしているかは、人それぞれだろう。Gmailのサービスを利用するとしても、ある人は、GmailのWebサイトを利用しているだろうし、ある人は、macOS標準のメール.appを利用しているだろう。また、Windows10であれば、標準のメールアプリを使っているかもしれない。もちろん、そうしたメールソフトで受信したデータを利用してメールデータを読み出すこともできるだろう。

しかし、Pythonを使えば、Gmailのメールサーバから直接メールをダウンロードすることができるので、メールデータを解析したい場合には、そちらの方が好都合だろう。なお、Gmailのメールの受信方法については、本連載の22回目23回目で詳しく紹介した。そこで、今回は、23回目の一番最後に紹介したプログラム「gmail-to-file.py」を利用して、受信したメールを一つずつ解析する方法を紹介しよう。

受信したメールを確認してみよう

連載の22回目と23回目の内容を読んでいられないという読者の皆さんのために、簡単に内容を復習してみよう。以下の手順で、Pythonを利用してGmailを受信できる。

(1) Googleの開発者コンソールで、Gmail APIを有効にする
(2) Gmail APIを利用するために、認証情報を作成して設定ファイルをダウンロードする。このとき、認証情報では、使用するAPIに「Gmail API」を、呼び出す場所に「その他のUI」を、データの種類を「ユーザーデータ」と設定
(3) ダウンロードしたファイルを「client_id.json」という名前で、23回目の最後で紹介した「gmail-to-file.py」と同じディレクトリに配置
(4) コマンドラインから「python gmail-to-file.py」を実行する
(5) Webブラウザが起動しGmailへのログイン画面が出るので、ユーザ名とパスワードを入力する

すると、Gmailからメールを受信して、gmaildataというフォルダにテキストファイルが100件作成される。このようにして受信したメールは、次のような形式となっている。

 From: 宛名<メールアドレス>
 Date: 受信した日付
 Subject: 件名

 Body:
 以下、メールの本文

ただのテキストファイルなので、テキストエディタを使って確認することができる。

  • 受信したメールがテキスト形式で保存されるのでテキストエディタでも確認できる

    受信したメールがテキスト形式で保存されるのでテキストエディタでも確認できる

直近100件のメールで誰が一番多くメールをくれたのか調べよう

ここまでの部分で、今回、Pythonで作るプログラムに関する資料が揃ったことになる。つまり、保存されたテキストファイル100件を順々に読んでいって、一行目にかかれている「From: xxx@xxx.com」の部分をカウントするなら、誰が一番メールをくれたのか調べることができるという訳だ。

それではさっそくプログラムを作ってみよう。

 import glob
 # 対象フォルダを指定 --- (*1)
 TARGET_DIR = './gmaildata'
 counter = {} # カウント用の変数 --- (*2)
 # ファイル一覧を列挙 --- (*3)
 files = glob.glob(TARGET_DIR + '/*.txt')
 for f in files:
     # ファイルを読み込む --- (*4)
     try:
         lines = open(f, 'rt', encoding='utf-8').readlines()
     except:
         continue
     if lines is None or len(lines) == 0: continue
     # 一行目の送信者を得る --- (*5)
     addr = lines[0].strip()
     # カウントする --- (*6)
     if addr in counter:
         counter[addr] += 1
     else:
         counter[addr] = 1
 # 数の多い順に並べて表示 --- (*7)
 for addr,cnt in sorted(counter.items(), key=lambda x:-x[1]):
     print(cnt, addr)

このプログラムを「gmail-to-file.py」と同じディレクトリに「count-from.py」というファイル名で保存しよう。そして、コマンドラインから、以下のように実行しよう。

 python count-from.py

すると、既に受信したテキストファイルの内容を確認し、解析を行い結果を表示する。

  • 誰が一番メールをくれたのか結果を表示したところ

    誰が一番メールをくれたのか結果を表示したところ

プログラムを確認してみよう。プログラムの(*1)で解析対象フォルダを指定する。これは、メールを受信する先のgmail-to-file.pyと合わせている。(*2)の部分では、Fromフィールドを数えるためのカウント変数counterを初期化している。辞書型のデータで、キーがFromフィールドで、値がカウント回数だ。そして、(*3)の部分では、globモジュールを使って、テキストファイルの一覧を取得し、for .. in 構文を利用して、繰り返しファイルの一覧を処理するように指定する。

そして、(*4)の部分では、ファイルを読み込み、読んだファイルを各行で区切ってリスト型で取得する。(*5)の部分だが、今回、テキストファイルの一行目がFromフィールドであることが分かっているので、とにかくリストの先頭要素をメールアドレスと決め打ちして処理する。(*6)では、辞書型の変数counterでアドレスをキーに対してカウント処理を行う。そして、(*7)の部分では、counterの値をソートして、数の多い順に画面に結果を出力する。

まとめ

以上、今回は、誰が一番メールをくれたのかを調べるプログラムを作ってみた。試しに、筆者のアカウントで実行してみたところ、「Google Alert」(新着情報があると通知してくれるサービス)からのメールが一番多かった。もし、彼女からのメールが一番多かったら、なんて原稿に書こうかとドキドキしながら結果を見たのだが、それは杞憂に終わった。それどころか、プライベートなメールは一件もなく、直近100件のメールのほとんどが、ダイレクトメールやニュース、定期的なサーバログという結果になった。このように、メールの送信元情報を確認するだけでも、いろいろな事が分かるので、試してみると良いだろう。また、このプログラムを応用すると、もっとも面白いことができるだろう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。