summaryrefslogtreecommitdiff
path: root/service/pixelated/adapter
diff options
context:
space:
mode:
Diffstat (limited to 'service/pixelated/adapter')
-rw-r--r--service/pixelated/adapter/model/mail.py44
-rw-r--r--service/pixelated/adapter/services/draft_service.py7
-rw-r--r--service/pixelated/adapter/services/mail_service.py4
-rw-r--r--service/pixelated/adapter/services/mailboxes.py14
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)