Pythonでメールを受信してみる
Pythonでメールを受信してみようと思った。インターネットにはたくさんのサンプルプログラムがあるので参考にした。作ったプログラムは、POPサーバからメールメッセージを受信し、それぞれの受信時刻とサブジェクト(掲題)を表示して、終了する。
プログラムを実行して困ったのは、いつものごとく、機種依存文字の扱いだ。メールがiso-2022-jpの文字コード範囲で記述されているならば問題ないのだが、現実的には「①」、「㍑」とかの機種依存文字が使われている。これの対処に、pykfで解決することにした。
pykfのインストールは機種依存文字対策でpykfをインストールしてみたを参照。
# -*- coding:utf-8 -*- import poplib import email import pykf import time def parse_subject(msg): m_subject = msg.get('Subject') d_subject, enc = email.Header.decode_header(m_subject)[0] if enc == 'iso-2022-jp': subject = unicode(pykf.tosjis(d_subject), 'cp932') elif enc == None: subject = m_subject else: subject = unicode(d_subject, enc) return subject def parse_date(msg): m_date = msg.get('Date') d_date = email.utils.parsedate(m_date) return time.strftime("%Y/%m/%d %H:%M:%S",d_date) def parse_message(msg_string): msg = email.message_from_string(msg_string) date = parse_date(msg) subject = parse_subject(msg) print date, subject def rcvmail(svr,usr,pwd): m = poplib.POP3(svr) m.user(usr) m.pass_(pwd) numMessages = len(m.list()[1]) for i in range(numMessages): msg = '\n'.join(m.retr(i+1)[1]) parse_message(msg) m.quit() if __name__ == '__main__': svr = 'xxxxxxxx' # あなたのPOPサーバ user_name = 'xxxxxxxx' #あなたのメールアカウント password = 'xxxxxxxx' #あなたのメールパスワード rcvmail(svr,user_name,password)
実行すると下記のとおり。機種依存文字の扱いもうまくできてます。
C:\home\py\pymail>rcvmail.py 2011/08/18 10:03:51 test 2011/08/18 10:04:29 テストメールだよ 2011/08/18 10:05:07 機種依存文字① 2011/08/18 10:05:45 機種依存文字①㍑だよ 2011/08/18 10:06:10 test2