10.22.2011

mogmail with Python version 2.0

Python版mogmail バージョン2.0

以前作成した、こちらのスクリプトを改良。
http://mogproject.blogspot.com/2011/10/mogmail-with-python-version-11.html

・メールが一通もない場合にメッセージを出すようにした。
・From/Subject に機種依存文字(丸囲み文字等)が入っている場合、文字コードのデコードに失敗していた。
 unicode 文字列を作成するときに errors='ignore' とすれば、ひとまずその文字はスキップされる。
 しかし、email.header モジュールのmake_header ではその指定ができないので仕方なく自分で実装。
・パーザーをクラス化。
・出力する文字コードを自動取得。(sys.stdout.encoding とする)
・通信中の例外発生時にもquit()が行われるようにした。

mogmail.py

#!/usr/bin/env python
# Copyright (c) 2011 Mog Project. All rights reserved.
# Version: 2.0, Updated: 2011/10/22

import poplib
import email
from email.header import decode_header
from email.utils import parsedate_tz
from email.utils import mktime_tz
import sys
import time

POP3_SERVER = 'POP3-Server'
POP3_PORT = 110
POP3_USERNAME = 'UserName'
POP3_PASSWORD = 'Password'
SHOW_LENGTH = 5

class Parser(object):
  def __init__(self, msg):
    self.msg = msg
  def date(self):
    return time.localtime(mktime_tz(parsedate_tz(self.msg['date'])))
  def from_(self): return self.get_item('from')
  def subject(self): return self.get_item('subject')
  def get_item(self, key):
    uchunks = []
    decoded_seq = decode_header(self.msg[key].replace('"', ''))
    for s, charset in decoded_seq:
      if not charset: charset = 'us-ascii'
      uchunks.append(unicode(s, charset, 'ignore'))
    return u''.join(uchunks).encode(sys.stdout.encoding)

pop3 = poplib.POP3(POP3_SERVER, POP3_PORT)
try:
  pop3.apop(POP3_USERNAME, POP3_PASSWORD)
  msg_cnt = pop3.stat()[0]
  if not msg_cnt: print 'No message.'
  for i in range(msg_cnt, max(msg_cnt - SHOW_LENGTH, 0), -1):
    p = Parser(email.message_from_string('\n'.join(pop3.top(i, 0)[1])))
    print time.strftime('[%m/%d %H:%M]', p.date()),
    print '%s\n  %s' % (p.from_(), p.subject())
except poplib.error_proto, detail:
  print 'POP3 Protocol Error:', detail
finally:
  pop3.quit()

0 件のコメント:

コメントを投稿