poplibモジュール
受信したメールを処理するプログラムをpythonで書きたいので、
まずは poplibモジュールの勉強。参考にさせていただいたのは
http://nagosui.org:8080/Nagosui/COREBlog2/categories/learning-python/cbcategory_view?b_start:int=9&-C=
のページです。
このモジュールはPOP3クラスを提供してくれる。
まずはメールサーバへのログイン。POP3オブジェクトを作ってuser(),pass_()メソッドを使えばよいみたい。
>>> import poplib >>> p = poplib.POP3("mail.xxxx.co.jp") #サーバ名を指定する。第2引数のportを省略すると >>> p.user("指定のID") POP3標準のポート(110)が使われる。 '+OK Password required for xxxx.' >>> p.pass_("指定のpass") '+OK xxxx has 1 visible message (0 hidden) in 1744 octets.'
user()メソッドはパスワード要求を、pass_()メソッドはメッセージ数とメールボックスサイズを返してくれるみたい。
つづいてメールを取り出すにはretr()メソッドを使えばよいみたい。引数には何番目のメッセージを取り出すのかを指定する。
>>> p.retr(1) ('+OK 1744 octets', ['Return-Path: <xxxx@xxxx.co.jp>', 'Delivered- To: xxxx@xxxxx.co.jp', 'Received: (qmail xxxx invoked from network ); 26 Dec 2008 17:17:57 +0900', ・・・・・・, '------=_NextPart_xx xx--', '', ''], 1744)
上の結果は省略した部分が多いけど、retr()メソッドを使って返ってくるのは3つの要素を持ったタプルでその内容は、
0番目の要素:サーバからの応答文字列
1番目の要素:メール本体の内容が1行ごとに分割されて含まれたリスト
2番目の要素:メッセージのサイズ
となるみたい。だからこの1番目の要素を取り出せばメッセージの内容が取得できるわけだから、
>>> p_message = p.retr(1)[1]
とすれば良いわけだ。
サーバとの接続を切断するにはquit()メソッドを使えばよいみたいで、
>>> p.quit() '+OK Pop server at mail.xxxx.co.jp signing off.'
受信メールのタイトルを取得する
poplibモジュールの勉強の続き。
まずは下調べをするためにとりあえずメールサーバにログインしておく。
後で使うので emailモジュールもインポートしておく。
>>> import poplib, email >>> server = "mail.xxxx.co.jp" >>> user_id = "xxxx" >>> user_pass = "xxxx" >>> p = poplib.POP3(server) >>> p.user(user_id) '+OK Password required for xxxx.' >>> p.pass_(user_pass) '+OK xxxx has 1 visible message (0 hidden) in 1744 octets.'
ここでメールの一覧を取得できる、POP3クラスのインスタンスの持つlist()メソッド
を使ってみる。表示させてみると、
>>> mail_list = p.list() >>> mail_list ('+OK 1 visible messages (1744 octets)', ['1 1744'], 8)
タプルが返ってきて、1番目の要素にメッセージ番号とメッセージボックスサイズから成る
リストがあるのでこれでメッセージ番号を取得できる。
1番目のメッセージの内容は p.retr(1)[1] で1行ごとに分割されて含まれたリストとして
取得できるということだった。
これを1つの文字列にして、emailモジュールの message_from_string()メソッドに渡して
やれば文字列からメッセージオブジェクト構造を作成し返してくれるみたい。
あとはメッセージオブジェクト構造からヘッダー部分を取得して適切なデコード処理等を
行えばメールタイトルを取得できるみたい。以上をふまえて
http://d.hatena.ne.jp/white-azalea/20080511/1210480754のページのサンプルコード
を使わせていただいて書いたのが以下のスクリプト(take_mail.py)。
# -*- coding: utf-8 -*- import poplib, email server = "mail.xxxx.co.jp" user_id = "xxxx" user_pass = "xxxx" p = poplib.POP3(server) p.user(user_id) p.pass_(user_pass) mail_list = p.list() for mail_id in mail_list[1]: (no, msg_size) = mail_id.split(" ") mail_data = p.retr(no) msg = email.message_from_string("\n".join(mail_data[1])) subject = email.Header.decode_header(msg["Subject"]) try: print unicode(subject) except: pass
実行結果は、
C:\works\python\book1>python take_mail.py [('test', None)]