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
