From 118c0b9aaae7499e7628d204cb6dcf7fa591d491 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 19 Sep 2012 17:23:50 +0200 Subject: [PATCH] The first three reasons have been handled. see #308 --- modoboa/extensions/webmail/imaputils.py | 1 + modoboa/extensions/webmail/lib.py | 30 ++++++++++++++++--------- modoboa/extensions/webmail/views.py | 6 ++--- requirements.txt | 1 + 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/modoboa/extensions/webmail/imaputils.py b/modoboa/extensions/webmail/imaputils.py index 90dbeff7f..b7260d922 100644 --- a/modoboa/extensions/webmail/imaputils.py +++ b/modoboa/extensions/webmail/imaputils.py @@ -102,6 +102,7 @@ class BodyStructure(object): extensions = ["envelopestruct", "bodystruct", "textlines"] + extensions for idx, value in enumerate(definition[7:]): params[extensions[idx]] = value + self.attachments += [params] def load_from_definition(self, definition, multisubtype=None): diff --git a/modoboa/extensions/webmail/lib.py b/modoboa/extensions/webmail/lib.py index 2079474d1..96864107b 100644 --- a/modoboa/extensions/webmail/lib.py +++ b/modoboa/extensions/webmail/lib.py @@ -180,19 +180,27 @@ class ImapEmail(Email): mformat = self.dformat if self.bs.contents.has_key(self.dformat) else fallback_fmt - pnum = self.bs.contents[mformat]['pnum'] - data = self.imapc._cmd("FETCH", mailid, "(BODY.PEEK[%s])" % pnum) - content = decode_payload(self.bs.contents[mformat]['encoding'], - data[int(mailid)]['BODY[%s]' % pnum]) - charset = self._find_content_charset(mformat) - if charset is not None: - content = content.decode(charset) + if len(self.bs.contents): + pnum = self.bs.contents[mformat]['pnum'] + data = self.imapc._cmd("FETCH", mailid, "(BODY.PEEK[%s])" % pnum) + content = decode_payload(self.bs.contents[mformat]['encoding'], + data[int(mailid)]['BODY[%s]' % pnum]) + charset = self._find_content_charset(mformat) + if charset is not None: + try: + content = content.decode(charset) + except (UnicodeDecodeError, LookupError): + import chardet + result = chardet.detect(content) + content = content.decode(result['encoding']) + self._fetch_inlines() + self.body = \ + getattr(self, "viewmail_%s" % mformat)(content, links=links) + else: + self.body = None + self._find_attachments() - self._fetch_inlines() - - self.body = \ - getattr(self, "viewmail_%s" % mformat)(content, links=links) msg = email.message_from_string(headers) for hdr in self.headernames: diff --git a/modoboa/extensions/webmail/views.py b/modoboa/extensions/webmail/views.py index 131a1b964..ffcd1a29a 100644 --- a/modoboa/extensions/webmail/views.py +++ b/modoboa/extensions/webmail/views.py @@ -40,9 +40,9 @@ def getattachment(request): resp["Content-Transfer-Encoding"] = partdef["encoding"] if partdef["disposition"] != 'NIL': disp = partdef["disposition"] - cd = "%s; %s=%s" % (disp[0], disp[1][0], disp[1][1]) + cd = '%s; %s="%s"' % (disp[0], disp[1][0], disp[1][1]) else: - cd = "attachment; filename=%s" % request.GET["fname"] + cd = 'attachment; filename="%s"' % request.GET["fname"] resp["Content-Disposition"] = cd resp["Content-Length"] = partdef["size"] return resp @@ -408,7 +408,7 @@ def getmailcontent(request): email = ImapEmail(mbox, mailid, request, links=int(request.GET["links"])) return _render(request, "common/viewmail.html", { "headers" : email.render_headers(folder=mbox, mail_id=mailid), - "folder" : mbox, "imapid" : mailid, "mailbody" : email.body + "folder" : mbox, "imapid" : mailid, "mailbody" : email.body if email.body else "" }) def viewmail(request): diff --git a/requirements.txt b/requirements.txt index 99e4359c7..56106e7c2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ south lxml pycrypto sievelib +chardet