Pythonでgmailの内容を取得する方法 本文、タイトルを取得する

gmailの基本的なログイン、ログアウト方法は前回の記事で説明しています。

今回は、ログインしたgmailから本文などを取得してみます。

前回の記事↓

Python3を使って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からメール取得とラベル付け

 

前の記事

Python3を使ってgmailを開く方法