diff --git a/emails/loader/__init__.py b/emails/loader/__init__.py index 079f703..a199fb2 100644 --- a/emails/loader/__init__.py +++ b/emails/loader/__init__.py @@ -22,10 +22,18 @@ class InvalidHtmlFile(LoadError): pass -def from_html(html, source_filename=None, base_url=None, message_params=None, local_loader=None, **kwargs): +def from_html(html, text=None, base_url=None, message_params=None, local_loader=None, + template_cls=None, message_cls=None, source_filename=None, requests_params=None, + **kwargs): + + if template_cls: + html = template_cls(html) + if template_cls and text: + text = template_cls(text) + message_params = message_params or {} - message = Message(html=html, **message_params) - message.create_transformer(requests_params=kwargs.pop('requests_params', None), + message = (message_cls or Message)(html=html, text=text, **message_params) + message.create_transformer(requests_params=requests_params, base_url=base_url, local_loader=local_loader) if message.transformer.tree is None: diff --git a/emails/loader/local_store.py b/emails/loader/local_store.py index f90f163..583a51c 100644 --- a/emails/loader/local_store.py +++ b/emails/loader/local_store.py @@ -289,7 +289,6 @@ class MsgLoader(BaseLoader): self._parsed = True def get_file(self, name): - #print("MsgLoader.get_file", name) self.parse() if name.startswith('cid:'): name = self._content_ids.get(name[4:]) diff --git a/emails/message.py b/emails/message.py index 0351348..f0ba436 100644 --- a/emails/message.py +++ b/emails/message.py @@ -17,7 +17,6 @@ from .backend.smtp import SMTPBackend from .store import MemoryFileStore, BaseFile from .signers import DKIMSigner - load_email_charsets() # sic! @@ -352,25 +351,23 @@ class MessageSendMixin(object): class MessageTransformerMixin(object): transformer_cls = None + _transformer = None - def create_transformer(self, **kw): - cls = self.transformer_cls + def create_transformer(self, transformer_cls=None, **kw): + cls = transformer_cls or self.transformer_cls if cls is None: - from emails.transformer import MessageTransformer + from .transformer import MessageTransformer # avoid cyclic import cls = MessageTransformer - self._transformer = cls(message=self, **kw) - return self._transformer def destroy_transformer(self): self._transformer = None @property def transformer(self): - t = getattr(self, '_transformer', None) - if t is None: - t = self.create_transformer() - return t + if self._transformer is None: + self.create_transformer() + return self._transformer def set_html(self, **kw): # When html set, remove old transformer @@ -378,7 +375,6 @@ class MessageTransformerMixin(object): BaseMessage.set_html(self, **kw) - class MessageDKIMMixin(object): dkim_cls = DKIMSigner diff --git a/scripts/make_rfc822.py b/scripts/make_rfc822.py index a7e0e0a..7878ba4 100755 --- a/scripts/make_rfc822.py +++ b/scripts/make_rfc822.py @@ -7,7 +7,9 @@ Simple utility that imports html from url ang print generated rfc822 message to Example usage: - $ python make_rfc822.py --url=http://lavr.github.io/python-emails/tests/campaignmonitor-samples/sample-template/template-widgets.html \ + $ python make_rfc822.py \ + --url=http://lavr.github.io/python-emails/tests/campaignmonitor-samples/sample-template/template-widgets.html \ + --inline-images \ --subject="Some subject" \ --from-name="Sergey Lavrinenko" \ --from-email=s@lavr.me \ @@ -25,7 +27,6 @@ Copyright 2013 Sergey Lavrinenko import sys import logging import json - import argparse import emails @@ -61,12 +62,24 @@ class MakeRFC822: else: message_id = None - message_params = dict(headers=self._headers_from_command_line(), - template_cls=T, - mail_from=(options.from_name, options.from_email), - subject=T(unicode(options.subject, 'utf-8')), - message_id=message_id) - message = emails.loader.from_url(url=options.url, images_inline=options.inline_images, message_params=message_params) + args = dict(images_inline=options.inline_images, + message_params=dict(headers=self._headers_from_command_line(), + mail_from=(options.from_name, options.from_email), + subject=T(unicode(options.subject, 'utf-8')), + message_id=message_id), + template_cls=T) + if options.url: + message = emails.loader.from_url(url=options.url, **args) + elif options.from_directory: + message = emails.loader.from_directory(options.from_directory, **args) + elif options.from_file: + message = emails.loader.from_file(options.from_file, **args) + elif options.from_zipfile: + message = emails.loader.from_zip(options.from_zipfile, **args) + else: + logging.error('No message source specified.') + sys.exit(1) + return message def _send_test_email(self, message): @@ -108,7 +121,6 @@ class MakeRFC822: except ValueError: # If it is not json, we expect one word with '@' sign assert len(l.split()) == 1 - print l login, domain = l.split('@') # ensure there is something email-like yield {'to': l} @@ -144,7 +156,10 @@ if __name__ == "__main__": parser = argparse.ArgumentParser( description='Imports html from url ang generate rfc822 message.') - parser.add_argument("-u", "--url", metavar="URL", dest="url", action="store", default=None, required=True) + parser.add_argument("-u", "--url", metavar="URL", dest="url", action="store", default=None) + parser.add_argument("--source-directory", dest="from_directory", action="store", default=None) + parser.add_argument("--source-file", dest="from_file", action="store", default=None) + parser.add_argument("--source-zipfile", dest="from_zipfile", action="store", default=None) parser.add_argument("-f", "--from-email", metavar="EMAIL", dest="from_email", default=None, required=True) parser.add_argument("-n", "--from-name", metavar="NAME", dest="from_name", default=None, required=True)