Python版mogmail バージョン2.2
こちらのスクリプトの改修。
http://mogproject.blogspot.com/2011/10/mogmail-with-python-version-21.html
出力をリダイレクトした場合など、sys.stdout.encoding が None になるケースがあった。
その場合は sys.getfilesystemencoding() から出力先のエンコーディングを取得するよう修正。
mogmail.py
#!/usr/bin/env python # Copyright (c) 2011 Mog Project. All rights reserved. # Version: 2.2, Updated: 2011/10/23 POP3_SERVER = 'POP3-Server' POP3_PORT = 110 POP3_USERNAME = 'UserName' POP3_PASSWORD = 'Password' SHOW_LENGTH = 5 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 if sys.stdout.encoding: OUTPUT_ENCONDING = sys.stdout.encoding else: OUTPUT_ENCONDING = sys.getfilesystemencoding() def jis_to_sjis(jis): esc_seq = ( # pair of (sequense, is_double_bytes) ('\x1b(B', False), # ASCII ('\x1b(J', False), # JIS X 0201-1976 Roman Set ('\x1b(I', False), # JIS X 0201-1976 Katakana ('\x1b$@', True), # JIS X 0208-1978 (old JIS kanji) ('\x1b$B', True), # JIS X 0208-1983 (new JIS kanji) ('\x1b&@\x1b$B', True), # JIS X 0208-1990 ('\x1b$(D', True) # JIS X 0212-1990 ) chunks = [] pos = 0 flg = False while pos < len(jis): for seq, is_double_bytes in esc_seq: if jis[pos:].startswith(seq): flg = is_double_bytes pos += len(seq) break else: if flg: hi, lo = ord(jis[pos]), ord(jis[pos + 1]) if hi & 1: hi = ((hi + 1) >> 1) + 0x70 lo += 0x1f else: hi = (hi >> 1) + 0x70 lo += 0x7d if hi >= 0xa0: hi += 0x40 if lo >= 0x7f: lo += 1 chunks.append(chr(hi) + chr(lo)) pos += 2 else: chunks.append(jis[pos]) pos += 1 return ''.join(chunks) 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' # If charset is iso-2022-jp(jis), convert to cp932(sjis) # for platform dependent characters. if charset == 'iso-2022-jp': s = jis_to_sjis(s) charset = 'cp932' uchunks.append(unicode(s, charset, 'ignore')) return u''.join(uchunks).encode(OUTPUT_ENCONDING) def main(): 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() if __name__ == '__main__': main()
0 件のコメント:
コメントを投稿