gmailの基本的なログイン、ログアウト方法は前回の記事で説明しています。
今回は、ログインしたgmailから本文などを取得してみます。
前回の記事↓
pythonでgmailを取得
まずは前回までのコードです。
#-*- coding:utf-8 -*-
import imaplib
import email #この二つをimport
mail=imaplib.IMAP4_SSL('imap.gmail.com',993) #SMTPは993,POPは995
mail.login('操作したいメールアドレス','そのメールアドレスのパスワード')
mail.select('inbox') #メールボックスの選択
type,data=mail.search(None,'ALL') #メールボックス内にあるすべてのデータを取得
for i in data[0].split(): #data分繰り返す
ok,x=mail.fetch(i,'RFC822') #メールの情報を取得
ms=email.message_from_string(x[0][1].decode('iso-2022-jp')) #パースして取得
mail.close()
mail.logout()
具体的な説明は前回の記事を参考にしてください。
上のソースコードだけでは、gmailにログインし、情報を取得したところまでです。
ここから具体的な操作にうつります。
差出人アドレスを取得
ad=email.header.decode_header(ms.get('From'))
これで’ad’にアドレスが入りますが、配列で返されます。
例)
[(b'\x\\\\\(B','iso-2022-jp'),(b'<○○××@□□.net>',None)]
とか
[('hellohello<○○××@□□.net>',None)]
ここでバイト文字「b’」とついているものは元に戻す必要がでてきます。(ここが面倒)
ad=email.header.decode_header(ms.get('From'))
ms_code=ad[0][1]
if(ms_code!=None):
address=ad[0][0].decode(ms_code)
address+=ad[1][0].decode(ms_code)
else:
address=ad[0][0]
「ms_code=ad[0][1]」はms_codeにms[0][1]に格納されている文字コードをいれます。
addressにad[0][0]をms_codeでデコードしたモノをいれ、そこにad[1][0]をms_codeでデコードしたモノを追加します。
出力すると
○○○○<○○××@□□.net>
という感じです。
printしてみるとわかると思います。
タイトルの取得
アドレスとほとんど同じようなものです。
sb=email.header.decode_header(ms.get('Subject'))
ms_code=sb[0][1]
if(ms_code!=None):
sbject=sb[0][0].decode(ms_code)
else:
ms_code=sb[1][1]
sbject=sb[1][0].decode(ms_code)
「sb=email.header.decode_header(ms.get(‘Subject’))」でsbにタイトルの要素を設定します。
ms_codeがNoneの場合があるので、そのときは文字コードがsb[1][1]にあります。
本文を取得
msはこのソースコードでは’iso-2022-jp’でデコードしていますが、文字化けする場合はほかのをつかってみましょう。
maintext=ms.get_payload()
maintextにmsの本文をいれています。
本文は.get_payload()で取得できます。
しかし、テキストタイプがhtmlの場合はタグも含まれてしまいます。
これで差出人、タイトル、本文の取得ができました。
まとめ
今回のまとめのコードです。
import imaplib
import email #この二つをimport
mail=imaplib.IMAP4_SSL('imap.gmail.com',993) #SMTPは993,POPは995
mail.login('操作したいメールアドレス','そのメールアドレスのパスワード')
mail.select('inbox') #メールボックスの選択
type,data=mail.search(None,'ALL') #メールボックス内にあるすべてのデータを取得
for i in data[0].split(): #data分繰り返す
ok,x=mail.fetch(i,'RFC822') #メールの情報を取得
ms=email.message_from_string(x[0][1].decode('iso-2022-jp')) #パースして取得
#差出人を取得
ad=email.header.decode_header(ms.get('From'))
ms_code=ad[0][1]
if(ms_code!=None):
address=ad[0][0].decode(ms_code)
address+=ad[1][0].decode(ms_code)
else:
address=ad[0][0]
#タイトルを取得
sb=email.header.decode_header(ms.get('Subject'))
ms_code=sb[0][1]
if(ms_code!=None):
sbject=sb[0][0].decode(ms_code)
else:
ms_code=sb[1][1]
sbject=sb[1][0].decode(ms_code)
#本文を取得
maintext=ms.get_payload()
#出力
print(sbject)
print(address)
print(maintext)
mail.close()
mail.logout()
結構やってみると簡単にできるものでした。
といってもpythonまったくやったことないという人には難しいと思いますが。
かくいう僕のソースコードでも、すべてのメールに対応できるわけではないので改善が必要でしょう。
参考サイト様を見ていただければ、もっと詳しく見ることができます。
参考サイト
もっと詳しく知りたい人はこちらのサイトを↓
Python3でGmailからメール取得とラベル付け