前回、Pythonでブラウザの操作をする方法を記しましたが他にもWebサービスを操作する事ができます。
そこで今回はPythonでグーグルのメールサービス「Gmail」をダウンロードしてファイルとして保存する方法を記します。
PythonでGメールのダウンロードする方法
# -*- coding: utf-8 -*- import imaplib import email from email.header import decode_header import codecs UserName="**********@gmail.com" PassName="**********" LabelName='****/*****' #----------------------------------- gmail = imaplib.IMAP4_SSL("imap.gmail.com",'993') gmail.login(UserName,PassName) gmail.select(LabelName) head,data = gmail.search(None, "(UNSEEN)") i=0 #取得したメール一覧の処理 for num in data[0].split(): try: h,d = gmail.fetch(num, '(RFC822)') msg = email.message_from_bytes(d[0][1]) header = decode_header(msg.get('Subject')) msg_subject = header[0][0] msg_encoding = header[0][1] or 'ISO-2022-JP' try: fr=str(msg_subject.decode(msg_encoding)) except: fr='gmail'+str(i) print(fr) #ファイルとして使用できない文字を除外 fr=fr.replace('$','$') fr=fr.replace('.','.') fr=fr.replace('<','<') fr=fr.replace('>','>') fr=fr.replace('@','@') fr=fr.replace('%','%') fr=fr.replace(':',':') fr=fr.replace('?','?') fr=fr.replace('|','|') fr=fr.replace('"','') fr=fr.replace("'",'') fr=fr.replace(' ','_') fr=fr.replace('/','/') fr=fr.replace('*','*') fr=fr.replace('+','+') fr=fr.replace('-','ー') fr=fr.replace('\\','¥') fr=fr.replace('\r\n','') fr=fr.replace('\n','') f=codecs.open(fr+str(i+1)+".eml","w","utf-8") f.write(str(msg)) f.close() i=i+1 except: i=i+1 #終了処理 gmail.close() gmail.logout() print("メール読み込み完了")
import imaplib
import email
from email.header import decode_header
Gメールをダウンロードするには、この3つのモジールをインポートします。
import codecs
また文字コードを指定してテキストファイルを保存するのにcodecsというモジュールもインポートしておきます。
初期化
gmail = imaplib.IMAP4_SSL(“imap.gmail.com”,’993′)
imaplibオブジェクト = imaplib.IMAP4_SSL(“imap.gmail.com”,’993′)
imaplibオブジェクトを取得します。
ログインする方法
gmail.login(UserName,PassName)
imaplibオブジェクト.login( ユーザー名 , パスワード )
第1引数にユーザー名、第2引数にパスワードを入力しログインします。
読み込み先のラベルを指定する方法
gmail.select(LabelName)
imaplibオブジェクト.select( ラベルの名前 )
読み込むメールが入っているラベルを指定します。
ラベルに階層がある場合はparentlabel/Childlabelといったように「/」で区切ります。
また指定できるのはアルファベットのラベルのみです。
メールを受け取る方法
head,data = gmail.search(None, “(UNSEEN)”)
返値1,返値2=gmail.search(None, フラグ )
フラグでメールの状態によって取得する物が選ぶ事ができるようになっています。
“(UNSEEN)”なら未読の物のみ、”(ALL)”なら全てが受け取ります。
このサンプルでは(UNSEEN)を指定しているので未読メールを受け取ります。
これが成功すると返値1には「OK」が、返値2にはメールのインデックス配列が入ります。
for num in data[0].split():
メール個々にアクセスするにはdata[0].split():で得た配列に対してforで一つ一つアクセスしていきます。
h,d = gmail.fetch(num, ‘(RFC822)’)
返値1,返値2 = gmail.fetch(受け取るメールの番号, ‘(RFC822)’)
これが成功すると返値1には「OK」が、返値2にはメールのデータが入ります。
msg = email.message_from_bytes(d[0][1])
メールを受け取る変数= email.message_from_bytes(d[0][1])
これでメールのデータが受け取れます。
メールのタイトルを取得する方法
header = decode_header(msg.get(‘Subject’))
ヘッダーオブジェクト = decode_header(msg.get(‘Subject’))
ヘッダーオブジェクトを取得します。
msg_subject = header[0][0]
msg_encoding = header[0][1] or ‘ISO-2022-JP’
fr=str(msg_subject.decode(msg_encoding))
文字コードのISO-2022-JPでエンコードします。
これでメールのタイトルが取得できます。
終了処理する方法
gmail.close()
gmail.logout()
imaplibオブジェクト.close()
imaplibオブジェクト.logout()
imaplibオブジェクトを閉じる処理です。
まとめ
これでPythonによるGmailに保存されているメールを取得できます。
Gメールの整理などにも利用できるでしょう。
ちなみに、このサンプル通りにメールを取得するとgmail.fetch(num, ‘(RFC822)’)を使った時点で未読メールが既読メールとなります。
gmail.fetch(num, ‘(RFC822)’)の後にgmail.store(num, ‘-FLAGS’,’\\SEEN’)を使えばメールを未読に戻ります。
また、Gメール側の設定によっては外部アプリからのアクセスが遮断されてしまいメールが取得出来ない場合もあります。
そんな場合にはグーグルへログインし、「安全性の低いアプリの許可」を有効にするとメールが取得出来るようになります。
遮断された場合にはGメールに「ブロックされたログインについてご確認ください」というメールが来ますので、そこからも簡単に変更できるかと思います。