PythonでGmailを受信してMySQLに書き込む ~メーラーを使わずに自由な自動化~
こんにちはRcatです。
前回、以下の記事でPythonを使ってGMailを受信しました。
受信後はアドインという形で好きな処理ができる構造なので、今回はその中にMySQLに書き込むというのをやっていこうと思います。
はじめに
利用規約
情報や作品の活用時は事前に利用規約をご確認ください。
コメントについて
利用規約のガイドラインを確認の上コメントしてください。
則っていないコメントは削除します。
DB書き込み用に改造
本記事は改造なので、前回の内容は読んでいる前提です。まだの方はこちら。
本体のアップデート
まずは本体の更新です。
前回までは差出人と件名と本文くらいでいいかと思っていたのですが、DBに書き込むにあたりもう少し詳細にしました。
UID
メールサーバー上で管理されているメールの識別子です。主キーにはこれを使います。差出人名
最近のメールだと、アドレスでなく名前で届きませんか?
調べてみると、両方ある場合があるそうです。前回の実装だと、名前かアドレスかが不安定だったので、きっちり取得して改善しました。生Body
ボディはHTMLタグを除去する前提でしたが、DBには情報を入れたいので除去しないことにしました。
なので、必要に応じて除去関数から取得を行います。添付ファイル
データに含まれているらしいので取得してみました。

テーブル構成
E-R図はこんな感じ。超簡単。
添付は複数あるかもしれないので分離。メールのuidを主キーと外部キーにして参照。

実際のテーブルデータ
メールボックス
試しに読み込んでみるとこんな感じ。プライベートなものだから塗りつぶしばっかりww

これを見ると、名前が無くアドレスしか持っていないメールも来てますね。しかもそれはテキスト形式っぽい。ちなみにbody_typeが0ならhtmlで1ならそれ以外です。
HTMLメールは普通にhtmlタグから始まっているので分かりやすいですね。ぶっちゃけ最初の15文字くらいに"html"が含まれるかどうかでも判定できそう。
一番下のテストメールは自分で送った添付有メールです。attachmentsが1になってますね。
日付と件名にはインデックスもかけてるので、一応検索もできます。
添付ファイル
添付はこんな感じ。
紐づいたuidとファイル名、タイプとバイナリです。
ぶっちゃけ使い道あるの??という感じではあります。

書き込みアドイン
DB書き込みはデフォルトではついていないものなので新しく作成しました。
アクション
DBアドインのアクションはこんな感じ。シンプルです。

DB書き込みコード
SQLは非常に単純。特に何か言うことはない。
唯一DBっぽいのはトランザクションですかね。添付ファイルがある場合に関係が崩れないようにトランザクションにしてます。


その他変更点
今までは条件を指定して、それを満たした場合に実行でしたが、それだとDB書き込みには不都合があるので、ALLフラグを追加しました。これにより条件が何であっても必ず実行されるアドインとなります。

適用方法
パッケージ
内容はアドインとSQLファイルです。また、DBからメール取得用のdbmailモジュールもあります。
アドインはmodulesフォルダにコピーすることでDB転送を行うようになります。
DB定義のSQLは、この下の手順でDB作成後にコピペしてテーブルを作成するためのものです
DB定義フォルダは定義書が入っています。分かる人は見てみてください。

dbmailはこの下のDBからメールを取得のセクションで使い方を解説しています。
なお、アドインは格納後以下の部分を自分の環境に合うように変更してください。

DB準備
DBアドインは事前にデータベースの準備が必要です。
以下の記事を参考にDBを導入後データベースの作成まで行います。
今回は"gmail"という名前のデータベースを作成します。
$ mysql -u root -p
mysql> CREATE DATABASE gmail;
mysql> USE gmail;
これ以降に配布されているテーブル定義をコピペDBからメールを取得
メールを書き込むだけでは使えないので、検索や取得を行うためのモジュールも作りました。
このモジュールはメインのgmail.pyと同じ階層においてください(emailmessageをimportするため)
検索
使い方は簡単で、DBログイン情報でインスタンス後、差出人、件名、時間で検索ができます。
件名だけ部分一致です。
使用例はこんな感じ、今回は件名"テスト"で検索して、2件メールが見つかっています。
中身はHTMLなので、そのままだとなんかよく分かりませんが、除去関数を通すとたった一行になります。

一応使い方はモジュール内の書いてあります。こっちの方が分かりやすいかも。
日時は1つだとその日一日、ふたつだと範囲になります。
複数の条件を指定するとAND条件になります。
多分、ある日付のメールである所から来たメールを探す的なことが多いのではないかと思います。

添付ファイルがある場合は、Save_attachments()で保存できます。
まとめ
今回はGmailを受信してMySQLに書き込んでみました。
今度はここからメールを読みだしてAIに掛けたりしたいですね。実はそういう目的が既にあったりするんですが…。
それではまたお会いしましょう。
配布情報
配布URL
以下のURLより配布しています。
利用規約に同意の上ご利用ください。
キーワード
以下の記事で必要なキーワードが開示されます。
リンク集
Pythonのインストール方法
ミニPCにLinuxをインストール
いいなと思ったら応援しよう!
情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。