From 42009ce9006a1c67df2dcebc6ff2002b36655682 Mon Sep 17 00:00:00 2001 From: Duda Dornelles Date: Thu, 28 Aug 2014 14:57:46 -0300 Subject: Neissi/Duda: sending emails. also moving local smtp creation to mail_service so we can use it later --- service/pixelated/adapter/mail_service.py | 27 ++++++++++++++++++++++++++ service/pixelated/adapter/pixelated_mail.py | 27 ++++++++++++++++++++------ service/pixelated/bitmask_libraries/session.py | 10 +--------- service/pixelated/bitmask_libraries/smtp.py | 4 ++-- service/pixelated/user_agent.py | 26 +++++++------------------ 5 files changed, 58 insertions(+), 36 deletions(-) (limited to 'service/pixelated') 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/') 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']) -- cgit v1.2.3