Source code for api.email
"""
This file email.py contains functions for sending
text and html rendered emails asynchronously
"""
from threading import Thread
from flask import current_app
from flask import render_template
from flask_mailman import EmailMultiAlternatives
def _send_email_helper(app, msg):
"""
Helper function used for sending email message
Args:
app (Flask): The flask app object
msg (flask-mailman email object): any email/messsage object
defined for flask-mailman. Example EmailMessage
"""
with app.app_context():
if (
"MAIL_USERNAME" not in current_app.config
or "MAIL_PASSWORD" not in current_app.config
or current_app.config["MAIL_USERNAME"] is None
or current_app.config["MAIL_PASSWORD"] is None
):
print(
"\nShopyo Error: MAIL_USERNAME, and/or MAIL_PASSWORD not configured\n"
)
return
msg.send()
[docs]def send_async_email(to, subject, template, from_email=None, **kwargs):
"""
Sends email anachronously i.e the function is non blocking.
Assume email template is valid i.e it can be rendered using
flask' render_template function and both .html and .txt
email template files exits
Args:
to (String): recipient of the email
subject (String): subject of the email
template (String): template file path to be used in email body
from_email (String, optional): sender of the email. If not set
MAIL_DEFAULT_SENDER is used from config.
"""
if from_email is None:
if (
"MAIL_DEFAULT_SENDER" not in current_app.config
or current_app.config["MAIL_DEFAULT_SENDER"] is None
):
print("\nShopyo Error: MAIL_DEFAULT_SENDER not configured\n")
return
from_email = current_app.config["MAIL_DEFAULT_SENDER"]
app = current_app._get_current_object()
template_txt = render_template(f"{template}.txt", **kwargs)
template_html = render_template(f"{template}.html", **kwargs)
msg = EmailMultiAlternatives(
subject=subject,
body=template_txt,
from_email=from_email,
to=[to],
)
msg.attach_alternative(template_html, "text/html")
thr = Thread(target=_send_email_helper, args=[app, msg])
thr.start()
return thr