Skip to content

Commit

Permalink
...
Browse files Browse the repository at this point in the history
  • Loading branch information
lavr committed Feb 23, 2015
1 parent d2bb0bb commit 336807b
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 34 deletions.
10 changes: 9 additions & 1 deletion emails/loader/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
25 changes: 24 additions & 1 deletion emails/loader/loaders.py
Original file line number Diff line number Diff line change
Expand Up @@ -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})
Expand All @@ -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):
Expand Down Expand Up @@ -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
72 changes: 43 additions & 29 deletions emails/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

load_email_charsets() # sic!

ROOT_PREAMBLE = 'This is a multi-part message in MIME format.\n'



class BadHeaderError(ValueError):
Expand Down Expand Up @@ -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,
Expand All @@ -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', '<alice@me.com>' )
self._mail_from = mail_from and parse_name_and_email(mail_from) or None
Expand Down Expand Up @@ -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):
"""
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -392,6 +402,7 @@ def send(self,
return response[0]



def html(**kwargs):
return Message(**kwargs)

Expand Down Expand Up @@ -425,3 +436,6 @@ def message(self):
self._message.render(**self._context)
return self._message.message()




3 changes: 0 additions & 3 deletions emails/testsuite/message/helpers.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down

0 comments on commit 336807b

Please sign in to comment.