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 件のコメント:
コメントを投稿