Pythonでメールを受信してみる

2011/10/07

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

参考にしたサイト

Python

Posted by skw