summaryrefslogtreecommitdiff
path: root/service/pixelated
diff options
context:
space:
mode:
authorDuda Dornelles <ddornell@thoughtworks.com>2014-08-28 14:57:46 -0300
committerDuda Dornelles <ddornell@thoughtworks.com>2014-08-28 17:00:38 -0300
commit42009ce9006a1c67df2dcebc6ff2002b36655682 (patch)
tree52fd264dbecb986f37b2d79a75c70b1d69804a87 /service/pixelated
parent5207cd71baabc3203d3f7982d98168469139327d (diff)
Neissi/Duda: sending emails. also moving local smtp creation to mail_service so we can use it later
Diffstat (limited to 'service/pixelated')
-rw-r--r--service/pixelated/adapter/mail_service.py27
-rw-r--r--service/pixelated/adapter/pixelated_mail.py27
-rw-r--r--service/pixelated/bitmask_libraries/session.py10
-rw-r--r--service/pixelated/bitmask_libraries/smtp.py4
-rw-r--r--service/pixelated/user_agent.py26
5 files changed, 58 insertions, 36 deletions
diff --git a/service/pixelated/adapter/mail_service.py b/service/pixelated/adapter/mail_service.py
index 5a60d1bb..416c7bfc 100644
--- a/service/pixelated/adapter/mail_service.py
+++ b/service/pixelated/adapter/mail_service.py
@@ -16,6 +16,8 @@
import traceback
import sys
import os
+import smtplib
+from pixelated.bitmask_libraries.smtp import LeapSmtp
from twisted.internet import defer
from pixelated.bitmask_libraries.config import LeapConfig
from pixelated.bitmask_libraries.provider import LeapProvider
@@ -44,8 +46,27 @@ class MailService:
def __init__(self, leap_session):
self.leap_session = leap_session
self.account = leap_session.account
+ self.user_email = leap_session.account_email()
self.mailbox_name = 'INBOX'
+ def start(self):
+ try:
+ self.smtp_server = self._create_smtp_server()
+ self.smtp_client = self._create_smtp_client(self.smtp_server.smtp_info())
+ except:
+ traceback.print_exc(file=sys.stdout)
+ raise
+
+ def _create_smtp_server(self):
+ server = LeapSmtp(self.leap_session.provider, self.leap_session.nicknym.keymanager, self.leap_session.srp_session)
+ server.start()
+ return server
+
+ def _create_smtp_client(self, smtp_info):
+ smtp_servername, smtp_port = smtp_info
+ client = smtplib.SMTP(smtp_servername, smtp_port)
+ return client
+
@property
def mailbox(self):
return PixelatedMailbox(self.account.getMailbox(self.mailbox_name))
@@ -98,6 +119,12 @@ class MailService:
def mail(self, mail_id):
return self.mailbox.mail(mail_id)
+ def send(self, mail):
+ _from = self.user_email
+ _to = mail.get_to()
+
+ self.smtp_client.sendmail(_from, _to, mail.to_smtp_format(_from=_from))
+
def all_tags(self):
return self.mailbox.all_tags()
diff --git a/service/pixelated/adapter/pixelated_mail.py b/service/pixelated/adapter/pixelated_mail.py
index 547927a6..e43d5510 100644
--- a/service/pixelated/adapter/pixelated_mail.py
+++ b/service/pixelated/adapter/pixelated_mail.py
@@ -38,6 +38,12 @@ class PixelatedMail:
mail.tags = mail._extract_tags()
return mail
+ def set_from(self, _from):
+ self.headers['from'] = [_from]
+
+ def get_to(self):
+ return self.headers['to'][0]
+
def _extract_status(self):
return Status.from_flags(self.leap_mail.getFlags())
@@ -80,11 +86,20 @@ class PixelatedMail:
mime_multipart.attach(MIMEText(self.body, 'plain'))
return mime_multipart
+ def to_smtp_format(self, _from=None):
+ mime_multipart = self.to_mime_multipart()
+ mime_multipart['From'] = _from
+ return mime_multipart.as_string()
+
@staticmethod
def from_dict(mail_dict):
- mail = PixelatedMail()
- mail.headers = mail_dict['header']
- mail.body = mail_dict['body']
- mail.ident = mail_dict['ident']
- mail.tags = mail_dict['tags']
- return mail
+ return from_dict(mail_dict)
+
+
+def from_dict(mail_dict):
+ mail = PixelatedMail()
+ mail.headers = mail_dict['header']
+ mail.body = mail_dict['body']
+ mail.ident = mail_dict['ident']
+ mail.tags = mail_dict['tags']
+ return mail
diff --git a/service/pixelated/bitmask_libraries/session.py b/service/pixelated/bitmask_libraries/session.py
index 7fccc250..bb9bd3fe 100644
--- a/service/pixelated/bitmask_libraries/session.py
+++ b/service/pixelated/bitmask_libraries/session.py
@@ -118,12 +118,7 @@ class LeapSessionFactory(object):
incoming_mail_fetcher = self._create_incoming_mail_fetcher(nicknym, soledad,
account, auth)
- smtp = self._create_smtp_service(nicknym, auth)
- smtp.start()
-
- session = LeapSession(self._provider, auth, soledad, nicknym, account, incoming_mail_fetcher)
-
- return session
+ return LeapSession(self._provider, auth, soledad, nicknym, account, incoming_mail_fetcher)
def _lookup_session(self, key):
global SESSIONS
@@ -162,9 +157,6 @@ class LeapSessionFactory(object):
return LeapIncomingMail(nicknym.keymanager, soledad_session.soledad, account,
self._config.fetch_interval_in_s, self._account_email(auth))
- def _create_smtp_service(self, nicknym, auth):
- return LeapSmtp(self._provider, nicknym.keymanager, auth)
-
def _account_email(self, auth):
domain = self._provider.domain
name = auth.user_name
diff --git a/service/pixelated/bitmask_libraries/smtp.py b/service/pixelated/bitmask_libraries/smtp.py
index 94214e4c..76a232a6 100644
--- a/service/pixelated/bitmask_libraries/smtp.py
+++ b/service/pixelated/bitmask_libraries/smtp.py
@@ -35,7 +35,7 @@ class LeapSmtp(object):
print "## SMTP port: " + str(self._twisted_port)
def smtp_info(self):
- return ('localhost', LeapSmtp.SMTP_PORT)
+ return ('localhost', self._twisted_port)
def _discover_smtp_server(self):
json_data = self._provider.fetch_smtp_json()
@@ -79,7 +79,7 @@ class LeapSmtp(object):
email = '%s@%s' % (self._srp_session.user_name, self._provider.domain)
self._smtp_service, self._smtp_port = setup_smtp_gateway(
- port=(self._twisted_port),
+ port=self._twisted_port,
userid=email,
keymanager=self._keymanager,
smtp_host=self._hostname.encode('UTF-8'),
diff --git a/service/pixelated/user_agent.py b/service/pixelated/user_agent.py
index 433d4770..4b234fe8 100644
--- a/service/pixelated/user_agent.py
+++ b/service/pixelated/user_agent.py
@@ -36,7 +36,6 @@ app.config.from_pyfile(os.path.join(os.environ['HOME'], '.pixelated'))
leap_session = open_leap_session(app.config['LEAP_USERNAME'], app.config['LEAP_PASSWORD'], app.config['LEAP_SERVER_NAME'])
mail_service = MailService(leap_session)
-
def respond_json(entity):
response = json.dumps(entity)
return Response(response=response, mimetype="application/json")
@@ -54,14 +53,10 @@ def disabled_features():
@app.route('/mails', methods=['POST'])
-def save_draft_or_send():
- ident = None
- if 'sent' in request.json['tags']:
- ident = mail_service.send_draft(converter.to_mail(request.json, account))
- else:
- ident = mail_service.save_draft(converter.to_mail(request.json, account))
- return respond_json({'ident': ident})
-
+def send_mail():
+ mail = PixelatedMail.from_dict(request.json)
+ mail_service.send(mail)
+ return respond_json(None)
@app.route('/mails', methods=['PUT'])
def update_draft():
@@ -130,19 +125,11 @@ def mark_mail_as_read(mail_id):
@app.route('/contacts')
def contacts():
- query = search_query.compile(request.args.get("q"))
- desired_contacts = [converter.from_contact(contact) for contact in mail_service.all_contacts(query)]
- return respond_json({'contacts': desired_contacts})
-
+ pass
@app.route('/draft_reply_for/<mail_id>')
def draft_reply_for(mail_id):
- draft = mail_service.draft_reply_for(mail_id)
- if draft:
- return respond_json(converter.from_mail(draft))
- else:
- return respond_json(None)
-
+ pass
@app.route('/')
def index():
@@ -152,6 +139,7 @@ def index():
def setup():
debug_enabled = os.environ.get('DEBUG', False)
reactor_manager.start_reactor(logging=debug_enabled)
+ mail_service.start()
app.run(host=app.config['HOST'], debug=debug_enabled, port=app.config['PORT'])