From 336807b7289c8e633b448e92ab464ce2ec905b1c Mon Sep 17 00:00:00 2001 From: Sergey Lavrinenko Date: Mon, 23 Feb 2015 19:01:09 +0300 Subject: [PATCH] ... --- emails/loader/__init__.py | 10 +++- emails/loader/loaders.py | 25 +++++++++- emails/message.py | 72 +++++++++++++++++------------ emails/testsuite/message/helpers.py | 3 -- 4 files changed, 76 insertions(+), 34 deletions(-) diff --git a/emails/loader/__init__.py b/emails/loader/__init__.py index 6a57537..edc0478 100644 --- a/emails/loader/__init__.py +++ b/emails/loader/__init__.py @@ -29,9 +29,17 @@ def from_zip(zip_file, **kwargs): return loader -def from_string(html, css_text=None, **kwargs): +def from_html(html, css_text=None, **kwargs): from .loaders import StringLoader loader = StringLoader(html, css_text=css_text, **kwargs) loader.load() return loader +from_string = from_html + + +def from_rfc822(msg, **kwargs): + from .loaders import RFC822Loader + loader = RFC822Loader(msg, **kwargs) + loader.load() + return loader \ No newline at end of file diff --git a/emails/loader/loaders.py b/emails/loader/loaders.py index 1b9cea4..fc2680d 100644 --- a/emails/loader/loaders.py +++ b/emails/loader/loaders.py @@ -30,6 +30,7 @@ def __init__(self, requests_params=None, self.requests_params = requests_params self.transformer = None self.css_inline = css_inline + self.transformer = None def fetch_url(self, url, valid_http_codes=(200, ), params=None): args = dict(allow_redirects=True, headers={'User-Agent': self.USER_AGENT}) @@ -46,7 +47,8 @@ def to_message(self): @property def html(self): - return self.transformer.to_string() + if self.transformer is not None: + return self.transformer.to_string() @property def text(self): @@ -145,3 +147,24 @@ def load(self): **self.kwargs) self.transformer.load_and_transform() + +class RFC822Loader(BaseLoader): + def __init__(self, msg, **kwargs): + self.msg = msg + self._text = None + self.kwargs = kwargs + super(RFC822Loader, self).__init__(**kwargs) + + def load(self): + store = local_store.MsgLoader(msg=self.msg) + self._text = store.get_source('__index.txt') + html = store.get_source('__index.html') + if html: + self.transformer = Transformer(html=html, + local_loader=store, + **self.kwargs) + self.transformer.load_and_transform() + + @property + def text(self): + return self._text \ No newline at end of file diff --git a/emails/message.py b/emails/message.py index 17e444d..d656724 100644 --- a/emails/message.py +++ b/emails/message.py @@ -19,7 +19,7 @@ load_email_charsets() # sic! -ROOT_PREAMBLE = 'This is a multi-part message in MIME format.\n' + class BadHeaderError(ValueError): @@ -48,23 +48,17 @@ class IncompleteMessage(Exception): pass -class Message(object): - """ - Email class - message = HtmlEmail() - Message parts: - * html - * text - * attachments +class BaseMessage(object): """ + Base email message with html part, text part and attachments. + """ + + ROOT_PREAMBLE = 'This is a multi-part message in MIME format.\n' attachment_cls = BaseFile - dkim_cls = DKIMSigner - smtp_pool_factory = ObjectFactory - smtp_cls = SMTPBackend filestore_cls = MemoryFileStore def __init__(self, @@ -87,16 +81,14 @@ def __init__(self, self.set_mail_from(mail_from) self.set_mail_to(mail_to) self.set_headers(headers) - self.set_html(html=html) # , url=self.html_from_url) - self.set_text(text=text) # , url=self.text_from_url) + self.set_html(html=html) + self.set_text(text=text) self.render_data = {} - self._dkim_signer = None + if attachments: for a in attachments: self.attachments.add(a) - self.after_build = None - def set_mail_from(self, mail_from): # In: ('Alice', '' ) self._mail_from = mail_from and parse_name_and_email(mail_from) or None @@ -133,11 +125,6 @@ def set_text(self, text, url=None): self._text = text self._text_url = url - def attach(self, **kwargs): - if 'content_disposition' not in kwargs: - kwargs['content_disposition'] = 'attachment' - self.attachments.add(kwargs) - @classmethod def from_loader(cls, loader, template_cls=None, **kwargs): """ @@ -180,12 +167,6 @@ def get_subject(self): def render(self, **kwargs): self.render_data = kwargs - @property - def attachments(self): - if self._attachments is None: - self._attachments = self.filestore_cls(self.attachment_cls) - return self._attachments - def set_date(self, value): if isinstance(value, string_types): _d = dateutil_parse(value) @@ -244,12 +225,23 @@ def set_header(self, msg, key, value, encode=True): msg[key] = encode and self.encode_header(value) or value + @property + def attachments(self): + if self._attachments is None: + self._attachments = self.filestore_cls(self.attachment_cls) + return self._attachments + + def attach(self, **kwargs): + if 'content_disposition' not in kwargs: + kwargs['content_disposition'] = 'attachment' + self.attachments.add(kwargs) + def _build_message(self, message_cls=None): message_cls = message_cls or SafeMIMEMultipart msg = message_cls() - msg.preamble = ROOT_PREAMBLE + msg.preamble = self.ROOT_PREAMBLE self.set_header(msg, 'Date', self.message_date, encode=False) self.set_header(msg, 'Message-ID', self.message_id(), encode=False) @@ -300,6 +292,24 @@ def _build_message(self, message_cls=None): return msg + + + +class Message(BaseMessage): + """ + Email class + """ + + dkim_cls = DKIMSigner + smtp_pool_factory = ObjectFactory + smtp_cls = SMTPBackend + + def __init__(self, **kwargs): + BaseMessage.__init__(self, **kwargs) + self._dkim_signer = None + self.after_build = None + + def message(self, message_cls=None): msg = self._build_message(message_cls=message_cls) if self._dkim_signer: @@ -392,6 +402,7 @@ def send(self, return response[0] + def html(**kwargs): return Message(**kwargs) @@ -425,3 +436,6 @@ def message(self): self._message.render(**self._context) return self._message.message() + + + diff --git a/emails/testsuite/message/helpers.py b/emails/testsuite/message/helpers.py index 8a3e4d0..94b727f 100644 --- a/emails/testsuite/message/helpers.py +++ b/emails/testsuite/message/helpers.py @@ -1,13 +1,10 @@ # coding: utf-8 from __future__ import unicode_literals - -import logging import os import emails from emails.compat import StringIO from emails.template import JinjaTemplate -from emails.compat import NativeStringIO, to_bytes TRAVIS_CI = os.environ.get('TRAVIS') HAS_INTERNET_CONNECTION = not TRAVIS_CI