# Copyright 2016 Lars Wirzenius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # =*= License: GPL-3+ =*= import email class MessageRenderer(object): def summary(self, msg): sender = self._get_header(msg, 'From') date = self._get_header(msg, 'Date') body = self._plain_text_body(msg) indented_body = self._indent(body.strip()) return u'From: {}\nDate: {}\n\n{}'.format( sender, date, indented_body) def _indent(self, text): fmt = u' {}\n' return u''.join(fmt.format(line) for line in text.splitlines()) def _get_header(self, msg, name): decoded = email.header.decode_header(msg[name]) combined = u' '.join( self._decode_safely(value, encoding) for value, encoding in decoded) return combined def _decode_safely(self, s, encoding): try: return s.decode(encoding or 'us-ascii') except LookupError: return repr(s) except UnicodeDecodeError: return repr(s) def _plain_text_body(self, msg): body = self._find_first_plain_text_part(msg) if body is None: return u'' text = self._get_payload_as_unicode(body) return self._strip_signature(text) def _find_first_plain_text_part(self, msg): for part in msg.walk(): if part.get_content_type() == 'text/plain': return part return None def _get_payload_as_unicode(self, body): charset = body.get_param('charset', 'us-ascii') text = body.get_payload(decode=True) return self._decode_safely(text, charset) def _strip_signature(self, text): sigsep = u'\n-- \n' parts = text.split(sigsep) return parts[0]