プログラムとその他いろいろメモ

PythonでGmailに来たメールを読み込む方法

WindowsPCでPythonを通してGmailにアクセスし未読のメールをダウンロードさせる事が出来ます。

ただしgoogleのアカウントの方にも設定が必要になります。

https://myaccount.google.com/security
ここで設定を変更します。

2022年5月以前は「安全性の低いアプリを許可」をすれば良かっただけですが
以降は「2段階認証」をして「アプリパスワード」を入手し、それをPythonに入力しなければならなくなったようです。

まずは「2段階認証」を設定します。

この2段階認証とはGoogleにログインする度にスマホへSNSメッセージでGoogle確認コードが送られてくるので、それを入力する必要になるシステムです。
なのでスマホの電話番号を登録する必要があります。

スマホが無い人はスマホを入手してから試してください。

2段階認証が設定できたらアプリパスワードを取得します。

「アプリ パスワードを生成するアプリとデバイスを選択してください。」とされる文字の下にある「アプリを選択」のプルダウンメニューから「メール」を
「デバイスを選択」のプルダウンメニューから「Windows パソコン」を選択し、右下にある生成ボタンを押します。

そうするとアプリ パスワードが作られるので、これを使ってGmailを取得する時のパスワードとして利用します。

PythonでGmailに来たメールを読み込んで.emlファイルにしてダウンロードする方法

import imaplib
import email
import sys, codecs
from email.header import decode_header
#-----------------------------------

UserName="****@gmail.com"
AppPass="******************"
LabelName='***/***'

#-----------------------------------
def get_content(msg):
    charset = msg.get_content_charset()
    payload = msg.get_payload(decode=True)
    try:
        if payload:
            if charset:
                return payload.decode(charset)
            else:
                return payload.decode()
        else:
            return ""
    except:
        return payload # デコードできない場合は生データにフォールバック

#-----------------------------------
gmail = imaplib.IMAP4_SSL("imap.gmail.com",'993')
gmail.login(UserName   ,AppPass)
gmail.select("Notes")
gmail.select(LabelName)

typ, data = gmail.search(None, "(UNSEEN)")
#typ, data = gmail.search(None, "(ALL)")
print("メール読み込み開始")

i=0
#取得したメール一覧の処理
for num in data[0].split():
    try:
        typ, 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)
            pass

        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','')
        #print(str(i+1)+"個目  "+fr)
        #print(fr)
        #exit()
        f=codecs.open(Path+fr+str(i+1)+".eml","w","utf-8")
        print(get_content(msg))
        f.write(get_content(msg))
        f.close()
        i=i+1
        #break
    except:
        i=i+1
        pass

#終了処理
gmail.close()
gmail.logout()

UserNameにGmailのアドレスを入力
AppPassにアプリパスワードを入力します。

LabelNameにはGmailの中から取得したいラベルの物を指定します。

モバイルバージョンを終了