Hatena::ブログ(Diary)

tachikawa844の日記

2008-12-27

受信メールのタイトルを取得する

| 17:27

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)]

poplibモジュール

| 11:49

受信したメールを処理するプログラム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.'