certidude/certidude/mailer.py

52 lines
1.7 KiB
Python
Raw Normal View History

2015-07-26 20:34:46 +00:00
import click
2015-07-26 20:34:46 +00:00
import os
import smtplib
from certidude.user import User
from markdown import markdown
2015-07-26 20:34:46 +00:00
from jinja2 import Environment, PackageLoader
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from urlparse import urlparse
2015-07-26 20:34:46 +00:00
env = Environment(loader=PackageLoader("certidude", "templates/mail"))
2017-04-21 21:22:08 +00:00
def send(template, to=None, include_admins=True, attachments=(), **context):
from certidude import authority, config
2017-04-21 16:58:01 +00:00
if not config.MAILER_ADDRESS:
# Mailbox disabled, don't send e-mail
return
2017-04-21 21:22:08 +00:00
recipients = ()
if include_admins:
recipients = tuple(User.objects.filter_admins())
if to:
2017-04-21 21:22:08 +00:00
recipients = (to,) + recipients
click.echo("Sending e-mail %s to %s" % (template, recipients))
subject, text = env.get_template(template).render(context).split("\n\n", 1)
html = markdown(text)
msg = MIMEMultipart("alternative")
2017-04-21 21:22:08 +00:00
msg["Subject"] = subject.encode("utf-8")
2017-04-21 16:58:01 +00:00
msg["From"] = "%s <%s>" % (config.MAILER_NAME, config.MAILER_ADDRESS)
2017-04-21 21:22:08 +00:00
msg["To"] = ", ".join([unicode(j) for j in recipients]).encode("utf-8")
2017-04-21 21:22:08 +00:00
part1 = MIMEText(text.encode("utf-8"), "plain", "utf-8")
part2 = MIMEText(html.encode("utf-8"), "html", "utf-8")
msg.attach(part1)
msg.attach(part2)
for attachment, content_type, suggested_filename in attachments:
part = MIMEBase(*content_type.split("/"))
part.add_header('Content-Disposition', 'attachment', filename=suggested_filename)
part.set_payload(attachment)
msg.attach(part)
2017-04-21 21:22:08 +00:00
click.echo("Sending to: %s" % msg["to"])
2017-04-21 16:58:01 +00:00
conn = smtplib.SMTP("localhost")
2017-04-21 21:22:08 +00:00
conn.sendmail(config.MAILER_ADDRESS, [u.mail for u in recipients], msg.as_string())