Skip to content

Commit 51c6e9a

Browse files
committed
Add TemplateEmail class
1 parent 50d8a14 commit 51c6e9a

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

plain-mail/plain/mail/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
EmailMultiAlternatives,
1616
SafeMIMEMultipart,
1717
SafeMIMEText,
18+
TemplateEmail,
1819
forbid_multi_line_headers,
1920
make_msgid,
2021
)
@@ -25,6 +26,7 @@
2526
"DNS_NAME",
2627
"EmailMessage",
2728
"EmailMultiAlternatives",
29+
"TemplateEmail",
2830
"SafeMIMEText",
2931
"SafeMIMEMultipart",
3032
"DEFAULT_ATTACHMENT_MIME_TYPE",

plain-mail/plain/mail/message.py

+67
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
from pathlib import Path
1616

1717
from plain.runtime import settings
18+
from plain.templates import Template, TemplateFileMissing
1819
from plain.utils.encoding import force_str, punycode
20+
from plain.utils.html import strip_tags
1921

2022
from .utils import DNS_NAME
2123

@@ -492,3 +494,68 @@ def _create_alternatives(self, msg):
492494
for alternative in self.alternatives:
493495
msg.attach(self._create_mime_attachment(*alternative))
494496
return msg
497+
498+
499+
class TemplateEmail(EmailMultiAlternatives):
500+
def __init__(
501+
self,
502+
*,
503+
template,
504+
context=None,
505+
subject="",
506+
from_email=None,
507+
to=None,
508+
bcc=None,
509+
connection=None,
510+
attachments=None,
511+
headers=None,
512+
alternatives=None,
513+
cc=None,
514+
reply_to=None,
515+
):
516+
self.template = template
517+
self.context = context or {}
518+
519+
self.body_html, body = self.render_content()
520+
521+
super().__init__(
522+
subject=subject,
523+
body=body,
524+
from_email=from_email,
525+
to=to,
526+
bcc=bcc,
527+
connection=connection,
528+
attachments=attachments,
529+
headers=headers,
530+
alternatives=alternatives,
531+
cc=cc,
532+
reply_to=reply_to,
533+
)
534+
535+
self.attach_alternative(self.body_html, "text/html")
536+
537+
def get_template_context(self):
538+
return self.context
539+
540+
def render_content(self):
541+
context = self.get_template_context()
542+
html_content = self.render_html(context)
543+
544+
try:
545+
plain_content = self.render_plain(context)
546+
except TemplateFileMissing:
547+
plain_content = strip_tags(html_content)
548+
549+
return html_content, plain_content
550+
551+
def render_plain(self, context):
552+
return Template(self.get_plain_template_name()).render(context)
553+
554+
def render_html(self, context):
555+
return Template(self.get_html_template_name()).render(context)
556+
557+
def get_plain_template_name(self):
558+
return f"mail/{self.template}.txt"
559+
560+
def get_html_template_name(self):
561+
return f"mail/{self.template}.html"

0 commit comments

Comments
 (0)