メールをslackに通知するだけならIFTTTとかでいいのだけど、もう少しいじりたいのでその基盤を作りました。
Gmail
初めはsmtplibとか元々python3にあるパッケージを使おうと試したんですが、最近(2017年2月現在)gmailは認証が厳しくなったのかうまく行きません。「python メール」とかでググると2015年、2016年の記事でsmtplibを利用したコードが沢山でますが認証失敗しちゃいます。ということでgoogle APIを使います。大体ここを参考にします。
PythonでGmailAPIを使ってみよう
https://github.com/TM-KNYM/How2UseGmailApiByPython
僕のリポジトリのgmailapi.pyは上記リポジトリのほぼパクリですが、2to3コマンドでpython3用に変更、pep8に準拠するようちょっと修正してます。
メソッドgetMailContentで指定したidのメール内容をdict型で取得できます。
メール本文bodyはbase64に変換されてるので以下を参考にutf8に直します。
Pythonでbase64エンコード・デコードする方法
http://yut.hatenablog.com/entry/20110825/1314228258
メール本文はurlも含むのでbase64.urlsafe_b64decode()でbytes型にdecodeし、
さらにdecode('utf-8')で見やすい形にします。
ちなみにsnippetは元々utf-8なんですよね。bodyも初めからutf-8にしてくれても良さそうですが……。
また上記プログラムを定期実行するとして、一度通知したメールを再度通知はしたくないと思います。
そのため基本は未読メール(is:unread)を取得し、取得したメールはメソッドdoMailAsRead()で既読した状態にしています。
slack
ここを参考にしました。
python-slackclient
https://github.com/slackapi/python-slackclient
メール本文は長くなるときもあるのでattrachemntsに入れて送信します。
api_call内でtextにそのまま入れるとslack上では全文一気に表示されちゃいますが、
attrachemntsだと短縮された状態で表示され、「Show more」をクリックすることで全文見れます。