moblog奮闘記2-1

moblog.pyを読んでみよう!

moblog.pyの構造

moblog.pyはモジュールをインポートする部分、関数を定義する部分(3つ)、関数を実行する部分に分かれています。

moblog-py

実際に実行されるのは最後にあるmain()だけですが、main()を実行する際にadd_moblog_entry()が、add_moblog_entry()を実行する際にget_parts()が呼ばれます。

main()の中身

main()は比較的短い関数で、携帯電話からメールサーバに送られたメールを読みとってCOREBlog2へ投稿するためのものです。モジュールとしてpoplibを利用しています。

poplibを使ってみる

試しにpoplibを使ってみます。poplibはPOP3クラスを提供してくれます。

このクラスが、実際にPOP3プロトコルを実装します。インスタンスが初期化 されるときに、コネクションが作成されます。 port が省略されると、POP3標準のポート(110)が使われます。

POP3オブジェクトにはログインするためのuser()、pass_()メソッドがあります。yahooのメールサーバにログインしてみます。

>>> import poplib
>>> p3 = poplib.POP3("pop.mail.yahoo.co.jp")
>>> p3.user("yahooのid")
'+OK password required.'
>>> p3.pass_("yahooのpass")
'+OK maildrop ready, 1 message (1290 octets) (1290 1073741824)'

user()メソッドはパスワード要求を返し、pass_()メソッドはメッセージ数とメールボックスサイズを返します。

実際にメールを取り出してみます。取り出すにはretr()メソッドを使います。引数には何番目のメッセージを取り出すかを与えます。

>>> p3.retr(1)
('+OK 742 octets', ['From: hogehoo@example.com', 'To: fugafuu@example.com', 'Sub
ject: =?iso-2022-jp?B?GyRCJEYkOSRIGyhC?=', ..., 'Date: Thu, 16 Nov 2006 23:07:50
 +0900', 'Mime-Version: 1.0', 'Content-Type: text/plain; charset="iso-2022-jp"',
 'Content-Transfer-Encoding: 7bit', '', '\x1b$B$U$,$U$,\x1b(B', '\x1b$B$W$j$W$j\
x1b(B'], 742)

上記は(個人情報に関する部分などを削除したり書き換えたりして)ちょっと手を入れていますが、retr()メソッドを使ったときに返ってくるのは3つの要素を持った下記のようなタプルになることがわかります。

  • 0番目の要素:サーバからの応答文字列
  • 1番目の要素:メール本体の内容が1行ごとに分割されて含まれたリスト
  • 2番目の要素:メッセージのサイズ

ということはこの1番目の要素を取り出せば、メッセージの内容を得ることができます。

# p3_messageにメッセージの内容を代入
>>> p3_message = p3.retr(1)[1]

quit()メソッドを使うと接続を切断します。

>>> p3.quit()
'+OK server signing off.'

main()の中身(前半)

前半は以下のようになっています。

def main():

    #
    # Please set some information,(host of mail server,etc) to use
    #

    import poplib
    s = poplib.POP3('host.of.mail.server')
    s.apop('yourmailaccount','mailpassword')
l = s.list()

apop()メソッドはAPOP認証機能を提供してくれますが、すべてのサーバがAPOPに対応しているわけではありません。そこでPOP3でログインするために上述したuser()メソッドおよびpass_()メソッドを使ってapop()メソッドを置き換えてみましょう。

def main():

    #
    # Please set some information,(host of mail server,etc) to use
    #

    import poplib
    s = poplib.POP3('host.of.mail.server')
s.user('mailaccount')
s.pass_('mailpassword')
l = s.list()

前半部の最後の部分ではlist()メソッドを使っています。

list()メソッドは

メッセージのリストを要求します。結果は以下のような形式で表されます。 (response, ['mesg_num octets', ...]) which が与えられると、それによりメッセージを指定します。

ということです。

main()の中身(後半)

後半は以下のようになっています。

    if len(l) and l[1]:
        m = s.retr(1)

        msgbody = '\n'.join(m[1])
        add_moblog_entry(msgbody,
         'http://[user]:[pass]@url.of.blog/path2/blog/','password4mail')

        s.dele(1)

    s.quit()

    return

最初に変数lおよびlの1番目の存在を確認し、変数mにretr()メソッドによって得られる3要素のタプルを代入しています。

さらにmsgbodyに「'\n'.join(m[1])」なるものが代入されています。

上述したようにm[1]は「メール本体の内容が1行ごとに分割されて含まれたリスト」になりますが、「'\n'.join(m[1])」という操作の結果はどうなるのでしょうか。

試しに以下のコードを実行してみます。

# 文字列からなるリストを用意
>>> test_m = ['1', '2', '3']

# moblog.pyと同様のことをしてみる
>>> test_msgbody = '\n'.join(test_m)

# 中身はどうなったのぉ~
>>> test_msgbody
'1\n2\n3'

ということは、この操作によってリスト内の各要素である文字列が「\n」でつなげられて、一つの文字列になっているということですね。

ということは、moblog.py内の変数msgbodyには、メール本体の内容が改行記号でつなげられた文字列が入っているわけですね。

この後add_moblog_entry()を使っているわけですが、その内容についてはまた今度見ることにします。

最後にdele()メソッドおよびquit()メソッドを利用して、メール削除フラグを立てて接続を終了しています。削除に関してはカスタマイズする余地というかやりようがありそうです。

カテゴリ
Python Python
moblog moblog
トラックバック用URL:
http://nagosui.org/Nagosui/COREBlog2/fight-for-moblog-2-1/tbping
コメントを追加

下のフォームに記入してコメントを追加できます。平文テキスト形式。

(必須)
(必須)
(必須)
(Required)
Enter the word

このBlogについて
Plone, Zope, Pythonなどのトピックについてのメモです。
カテゴリ
Plone (98)
Plone Products (23)
COREBlog2 (31)
COREBlog1 (29)
ReadingCOREBlog (7)
Zope (66)
Turbogears (18)
Django (12)
Python (25)
Linux (30)
Nagosui (12)
Design (33)
Misc (48)
moblog (5)
最近のエントリ
浜松ブラスバンド定期演奏会2008 nyusuke 2008年11月24日
Glossy Horizontal Menuを使う nyusuke 2008年11月17日
第3回Python東海終了 nyusuke 2008年11月17日
Universalじゃない件 nyusuke 2008年11月15日
最近のコメント
Re:WebデザイナーのためのDjangoはじめの一歩 nyusuke 2007年06月01日
Re:WebデザイナーのためのDjangoはじめの一歩 pateo 2007年05月31日
Re:東海Python Workshop 01終了 nyusuke 2007年05月31日
Re:東海Python Workshop 01終了 kfuruhata 2007年05月30日