Advertisement
Guest User

Untitled

a guest
May 25th, 2015
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.04 KB | None | 0 0
  1. %%file /ipy/mailcheck.py
  2. import mailbox
  3.  
  4. import email.utils
  5. import email.header
  6. import email.iterators
  7.  
  8. from IPython.html.widgets import interact, interactive, fixed
  9. from IPython.html import widgets
  10. from IPython.display import display
  11.  
  12. def decode_(packed_stff):
  13. bits, charset = email.header.decode_header(packed_stff)[0]
  14. if charset is None:
  15. return str(packed_stff)
  16. return str(bits, charset)
  17.  
  18. def get_charset(message, default="ascii"):
  19. gcc = message.get_content_charset()
  20. if gcc: return gcc
  21.  
  22. gc = message.get_charset()
  23. if gc: return gc
  24.  
  25. return default
  26.  
  27. def unicode_me(part, charset):
  28. return str(part.get_payload(decode=True), charset)
  29.  
  30. def get_parts_for_type(message, message_charset, type_):
  31. prefered_parts = tuple(email.iterators.typed_subpart_iterator(message, 'text', type_))
  32. charsets = [get_charset(part, message_charset) for part in prefered_parts]
  33. unicoded = [unicode_me(part, charset) for part, charset in zip(prefered_parts, charsets)]
  34. return u"\n".join(unicoded).strip()
  35.  
  36. def get_body(message):
  37. message_charset = get_charset(message)
  38. if message.is_multipart():
  39. text_plain = get_parts_for_type(message, message_charset, 'plain')
  40. if len(text_plain) > 0: return text_plain
  41. return get_parts_for_type(message, message_charset, 'html')
  42. else:
  43. return unicode_me(message, message_charset).strip()
  44.  
  45. def get_date_as_timestamp(message):
  46. return email.utils.parsedate(message['date'])
  47.  
  48. def list_mail(maildir, size):
  49. md = mailbox.Maildir(maildir)
  50.  
  51. from_message_id_to_timestamp = lambda mid: get_date_as_timestamp(md.get_message(mid))
  52. sorted_by_date = sorted(md.keys(), key=from_message_id_to_timestamp)
  53.  
  54. mails = []
  55. descr_to_mid = {}
  56. for mid in sorted_by_date[-size:]:
  57. _mail = md.get_message(mid)
  58. # Here I want to columnize the output, but {:10s} formatter dont work,
  59. # spaces are collapsed, and keys lost in 'options' {text: lid}
  60. descr_line = "{} from:{} subject:{}".format(
  61. _mail['date'],
  62. email.utils.parseaddr(_mail['from'])[-1],
  63. decode_(_mail['subject'])
  64. )
  65. mails.append(descr_line)
  66. descr_to_mid[descr_line] = mid
  67.  
  68. return md, mails, descr_to_mid
  69.  
  70. class tleilaxu_select:
  71. def __init__(self, maildir, max_size):
  72. self.size = 5
  73. self.max_size = max_size
  74. self.maildir = maildir
  75. self.select = widgets.Select(options=[], width=900)
  76. self.refresh()
  77. self.interactive = interactive(self.show, mail=self.select)
  78.  
  79. def resize(self, size):
  80. if self.max_size == size:
  81. # biggest size setting shows all
  82. size = -1
  83. self.size = size
  84. self.refresh()
  85.  
  86. def refresh(self, *args):
  87. md, mails, descr_to_mid = list_mail(self.maildir, self.size)
  88. self.md = md
  89. self.select.options = [] # flush
  90. self.select.options = mails # and show
  91. self.descr_to_mid = descr_to_mid
  92.  
  93. def show(self, mail):
  94. mid = self.descr_to_mid[mail]
  95. _mail = self.md.get_message(mid)
  96. print(_mail['date'], email.utils.parseaddr(_mail['from']))
  97. email.iterators._structure(_mail)
  98. print(decode_(_mail['subject']))
  99. print(get_body(_mail))
  100.  
  101. def make_button(self):
  102. button = widgets.ButtonWidget(description="Refresh !")
  103. button.on_click(self.refresh)
  104. return button
  105.  
  106. def make_slider(self):
  107. slider = interactive(self.resize, size=(0, self.max_size));
  108. return slider
  109.  
  110. def make_control_panel(self):
  111. button = self.make_button()
  112. slider = self.make_slider()
  113. main_container = widgets.HBox(children=[button, slider])
  114. return main_container
  115.  
  116. def run(**kwargs):
  117. select = tleilaxu_select(**kwargs)
  118. control_panel = select.make_control_panel()
  119. display(control_panel)
  120. display(select.interactive)
  121.  
  122. # use it in an ipython 3.1 notebook, the cell content in my case is 'import mailcheck; mailcheck.run(maildir='/home/boris/Maildir', max_size=20)'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement