diff options
Diffstat (limited to 'service/pixelated/adapter')
-rw-r--r-- | service/pixelated/adapter/model/mail.py | 44 | ||||
-rw-r--r-- | service/pixelated/adapter/services/draft_service.py | 7 | ||||
-rw-r--r-- | service/pixelated/adapter/services/mail_service.py | 4 | ||||
-rw-r--r-- | service/pixelated/adapter/services/mailboxes.py | 14 |
4 files changed, 49 insertions, 20 deletions
diff --git a/service/pixelated/adapter/model/mail.py b/service/pixelated/adapter/model/mail.py index 99ff0297..7c4223de 100644 --- a/service/pixelated/adapter/model/mail.py +++ b/service/pixelated/adapter/model/mail.py @@ -14,20 +14,21 @@ # You should have received a copy of the GNU Affero General Public License # along with Pixelated. If not, see <http://www.gnu.org/licenses/>. import json +import os +import re +import logging +import dateutil.parser as dateparser from uuid import uuid4 +from email import message_from_file from email.mime.text import MIMEText from email.header import decode_header - +from email.MIMEMultipart import MIMEMultipart +from pycryptopp.hash import sha256 from leap.mail.imap.fields import fields import leap.mail.walk as walk -import dateutil.parser as dateparser from pixelated.adapter.model.status import Status -import pixelated.support.date -from email.MIMEMultipart import MIMEMultipart -from pycryptopp.hash import sha256 -import re +from pixelated.support import date from pixelated.support.functional import compact -import logging logger = logging.getLogger(__name__) @@ -207,7 +208,7 @@ class InputMail(Mail): input_mail.headers = {key.capitalize(): value for key, value in mail_dict.get('header', {}).items()} # XXX this is overriding the property in PixelatedMail - input_mail.headers['Date'] = pixelated.support.date.iso_now() + input_mail.headers['Date'] = date.iso_now() # XXX this is overriding the property in PixelatedMail input_mail.body = mail_dict.get('body', '') @@ -218,6 +219,20 @@ class InputMail(Mail): input_mail._status = set(mail_dict.get('status', [])) return input_mail + @staticmethod + def from_python_mail(mail): + input_mail = InputMail() + input_mail.headers = {key.capitalize(): value for key, value in mail.items()} + input_mail.headers['Date'] = date.iso_now() + input_mail.headers['Subject'] = mail['Subject'] + input_mail.headers['To'] = InputMail.FROM_EMAIL_ADDRESS + input_mail._mime = MIMEMultipart() + for payload in mail.get_payload(): + input_mail._mime.attach(payload) + if payload.get_content_type() == 'text/plain': + input_mail.body = payload.as_string() + return input_mail + class PixelatedMail(Mail): @@ -305,7 +320,7 @@ class PixelatedMail(Mail): try: _headers['Date'] = self._get_date() except Exception: - _headers['Date'] = pixelated.support.date.iso_now() + _headers['Date'] = date.iso_now() if self.parts and len(self.parts['alternatives']) > 1: _headers['content_type'] = 'multipart/alternative; boundary="%s"' % self.boundary @@ -341,10 +356,10 @@ class PixelatedMail(Mail): else: # we can't get a date for this mail, so lets just use now logger.warning('Encountered a mail with missing date and received header fields. ID %s' % self.fdoc.content.get('uid', None)) - date = pixelated.support.date.iso_now() + date = date.iso_now() return dateparser.parse(date).isoformat() except (ValueError, TypeError): - date = pixelated.support.date.iso_now() + date = date.iso_now() return dateparser.parse(date).isoformat() @property @@ -487,3 +502,10 @@ class PixelatedMail(Mail): dict_mail['replying']['all']['to-field'] = recipients dict_mail['replying']['all']['cc-field'] = ccs return dict_mail + + +def welcome_mail(): + current_path = os.path.dirname(os.path.abspath(__file__)) + with open(os.path.join(current_path, '..', '..', 'assets', 'welcome.mail')) as mail_template_file: + mail_template = message_from_file(mail_template_file) + return InputMail.from_python_mail(mail_template) diff --git a/service/pixelated/adapter/services/draft_service.py b/service/pixelated/adapter/services/draft_service.py index df295eec..c8df0a05 100644 --- a/service/pixelated/adapter/services/draft_service.py +++ b/service/pixelated/adapter/services/draft_service.py @@ -22,13 +22,10 @@ class DraftService(object): self._mailboxes = mailboxes def create_draft(self, input_mail): - pixelated_mail = self._drafts().add(input_mail) + pixelated_mail = self._mailboxes.drafts.add(input_mail) return pixelated_mail def update_draft(self, ident, input_mail): pixelated_mail = self.create_draft(input_mail) - self._drafts().remove(ident) + self._mailboxes.drafts.remove(ident) return pixelated_mail - - def _drafts(self): - return self._mailboxes.drafts() diff --git a/service/pixelated/adapter/services/mail_service.py b/service/pixelated/adapter/services/mail_service.py index e392bc44..4e6b6aa8 100644 --- a/service/pixelated/adapter/services/mail_service.py +++ b/service/pixelated/adapter/services/mail_service.py @@ -76,8 +76,8 @@ class MailService(object): def move_to_sent(self, last_draft_ident, mail): if last_draft_ident: - self.mailboxes.drafts().remove(last_draft_ident) - return self.mailboxes.sent().add(mail) + self.mailboxes.drafts.remove(last_draft_ident) + return self.mailboxes.sent.add(mail) def mark_as_read(self, mail_id): mail = self.mail(mail_id) diff --git a/service/pixelated/adapter/services/mailboxes.py b/service/pixelated/adapter/services/mailboxes.py index e9fe6ce5..c2b61ca8 100644 --- a/service/pixelated/adapter/services/mailboxes.py +++ b/service/pixelated/adapter/services/mailboxes.py @@ -15,6 +15,7 @@ # along with Pixelated. If not, see <http://www.gnu.org/licenses/>. from pixelated.adapter.services.mailbox import Mailbox from pixelated.adapter.listeners.mailbox_indexer_listener import MailboxIndexerListener +from pixelated.adapter.model.mail import welcome_mail class Mailboxes(object): @@ -33,15 +34,19 @@ class Mailboxes(object): MailboxIndexerListener.listen(self.account, mailbox_name, self.querier) return Mailbox.create(mailbox_name, self.querier, self.search_engine) + @property def inbox(self): return self._create_or_get('INBOX') + @property def drafts(self): return self._create_or_get('DRAFTS') + @property def trash(self): return self._create_or_get('TRASH') + @property def sent(self): return self._create_or_get('SENT') @@ -49,10 +54,10 @@ class Mailboxes(object): return [self._create_or_get(leap_mailbox_name) for leap_mailbox_name in self.account.mailboxes] def move_to_trash(self, mail_id): - return self._move_to(mail_id, self.trash()) + return self._move_to(mail_id, self.trash) def move_to_inbox(self, mail_id): - return self._move_to(mail_id, self.inbox()) + return self._move_to(mail_id, self.inbox) def _move_to(self, mail_id, mailbox): mail = self.querier.mail(mail_id) @@ -62,3 +67,8 @@ class Mailboxes(object): def mail(self, mail_id): return self.querier.mail(mail_id) + + def add_welcome_mail_for_fresh_user(self): + if self.inbox.fresh: + mail = welcome_mail() + self.inbox.add(mail) |