From 4cb47c1848bb5d20b5ae167a7ab2879d00825f84 Mon Sep 17 00:00:00 2001 From: NavaL Date: Tue, 22 Dec 2015 18:16:17 +0100 Subject: decode to base64 the raw attachment that is in bytes... and renaming id to attachment_id in the mail POST Issue #548 --- service/pixelated/adapter/model/mail.py | 9 +++++++-- service/pixelated/resources/mails_resource.py | 15 +++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) (limited to 'service/pixelated') diff --git a/service/pixelated/adapter/model/mail.py b/service/pixelated/adapter/model/mail.py index 4f06588b..1a505481 100644 --- a/service/pixelated/adapter/model/mail.py +++ b/service/pixelated/adapter/model/mail.py @@ -19,6 +19,8 @@ import logging from email import message_from_file from email.mime.text import MIMEText from email.header import Header + +import binascii from email.MIMEMultipart import MIMEMultipart from email.mime.nonmultipart import MIMENonMultipart from pycryptopp.hash import sha256 @@ -111,8 +113,11 @@ class Mail(object): def _add_attachments(self, mime): for attachment in getattr(self, '_attachments', []): major, sub = attachment['content-type'].split('/') - attachment_mime = MIMENonMultipart(major, sub, Content_Disposition='attachment; filename=%s' % attachment['filename']) - attachment_mime.set_payload(attachment['raw']) + attachment_mime = MIMENonMultipart(major, sub) + base64_attachment_file = binascii.b2a_base64(attachment['raw']) + attachment_mime.set_payload(base64_attachment_file) + attachment_mime['Content-Disposition'] = 'attachment; filename="%s"' % attachment['filename'] + attachment_mime['Content-Transfer-Encoding'] = 'base64' mime.attach(attachment_mime) def _charset(self): diff --git a/service/pixelated/resources/mails_resource.py b/service/pixelated/resources/mails_resource.py index 38786e11..f9397263 100644 --- a/service/pixelated/resources/mails_resource.py +++ b/service/pixelated/resources/mails_resource.py @@ -177,25 +177,28 @@ class MailsResource(Resource): return server.NOT_DONE_YET @defer.inlineCallbacks - def _fetch_attachment_contents(self, attachments): + def _fetch_attachment_contents(self, content_dict): + attachments = content_dict.get('attachments', []) if content_dict else [] for attachment in attachments: - retrieved_attachment = yield self._mail_service.attachment(attachment['id']) + retrieved_attachment = yield self._mail_service.attachment(attachment['attachment_id']) attachment['raw'] = retrieved_attachment['content'] + content_dict['attachments'] = attachments + defer.returnValue(content_dict) @defer.inlineCallbacks def _handle_post(self, request): content_dict = json.loads(request.content.read()) - self._fetch_attachment_contents(content_dict.get('attachments', [])) + with_attachment_content = yield self._fetch_attachment_contents(content_dict) - sent_mail = yield self._mail_service.send_mail(content_dict) + sent_mail = yield self._mail_service.send_mail(with_attachment_content) respond_json_deferred(sent_mail.as_dict(), request) @defer.inlineCallbacks def _handle_put(self, request): content_dict = json.loads(request.content.read()) - self._fetch_attachment_contents(content_dict.get('attachments', [])) + with_attachment_content = yield self._fetch_attachment_contents(content_dict) - _mail = InputMail.from_dict(content_dict) + _mail = InputMail.from_dict(with_attachment_content) draft_id = content_dict.get('ident') pixelated_mail = yield self._draft_service.process_draft(draft_id, _mail) -- cgit v1.2.3