* Email footer refactor * styling fixes * Unsubscribe message * fix testversion-14
@@ -233,7 +233,8 @@ class EMail: | |||||
self.make() | self.make() | ||||
return self.msg_root.as_string() | return self.msg_root.as_string() | ||||
def get_formatted_html(subject, message, footer=None, print_html=None, email_account=None, header=None): | |||||
def get_formatted_html(subject, message, footer=None, print_html=None, | |||||
email_account=None, header=None, unsubscribe_link=None): | |||||
if not email_account: | if not email_account: | ||||
email_account = get_outgoing_email_account(False) | email_account = get_outgoing_email_account(False) | ||||
@@ -247,9 +248,13 @@ def get_formatted_html(subject, message, footer=None, print_html=None, email_acc | |||||
"subject": subject | "subject": subject | ||||
}) | }) | ||||
sanitized_html = scrub_urls(rendered_email) | |||||
transformed_html = inline_style_in_html(sanitized_html) | |||||
return transformed_html | |||||
html = scrub_urls(rendered_email) | |||||
if unsubscribe_link: | |||||
html = html.replace("<!--unsubscribe link here-->", unsubscribe_link.html) | |||||
html = inline_style_in_html(html) | |||||
return html | |||||
@frappe.whitelist() | @frappe.whitelist() | ||||
def get_email_html(template, args, subject, header=None): | def get_email_html(template, args, subject, header=None): | ||||
@@ -341,25 +346,20 @@ def get_footer(email_account, footer=None): | |||||
"""append a footer (signature)""" | """append a footer (signature)""" | ||||
footer = footer or "" | footer = footer or "" | ||||
args = {} | |||||
if email_account and email_account.footer: | if email_account and email_account.footer: | ||||
footer += '<div style="margin: 15px auto;">{0}</div>'.format(email_account.footer) | |||||
args.update({'email_account_footer': email_account.footer}) | |||||
company_address = frappe.db.get_default("email_footer_address") | company_address = frappe.db.get_default("email_footer_address") | ||||
if company_address: | if company_address: | ||||
company_address = company_address.splitlines(True) | |||||
footer += '<table width="100%" border=0>' | |||||
footer += '<tr><td height=20></td></tr>' | |||||
for x in company_address: | |||||
footer += '<tr style="margin: 15px auto; text-align: center; color: #8d99a6"><td>{0}</td></tr>'\ | |||||
.format(x) | |||||
footer += "</table>" | |||||
footer += "<!--unsubscribe link here-->" | |||||
args.update({'company_address': company_address}) | |||||
if not cint(frappe.db.get_default("disable_standard_email_footer")): | if not cint(frappe.db.get_default("disable_standard_email_footer")): | ||||
for default_mail_footer in frappe.get_hooks("default_mail_footer"): | |||||
footer += '<div style="margin: 15px auto;">{0}</div>'.format(default_mail_footer) | |||||
args.update({'default_mail_footer': frappe.get_hooks('default_mail_footer')}) | |||||
footer += frappe.utils.jinja.get_email_from_template('email_footer', args)[0] | |||||
return footer | return footer | ||||
@@ -75,8 +75,6 @@ def send(recipients=None, sender=None, subject=None, message=None, text_content= | |||||
except HTMLParser.HTMLParseError: | except HTMLParser.HTMLParseError: | ||||
text_content = "See html attachment" | text_content = "See html attachment" | ||||
formatted = get_formatted_html(subject, message, email_account=email_account, header=header) | |||||
if reference_doctype and reference_name: | if reference_doctype and reference_name: | ||||
unsubscribed = [d.email for d in frappe.db.get_all("Email Unsubscribe", "email", | unsubscribed = [d.email for d in frappe.db.get_all("Email Unsubscribe", "email", | ||||
{"reference_doctype": reference_doctype, "reference_name": reference_name})] | {"reference_doctype": reference_doctype, "reference_name": reference_name})] | ||||
@@ -88,14 +86,22 @@ def send(recipients=None, sender=None, subject=None, message=None, text_content= | |||||
recipients = [r for r in list(set(recipients)) if r and r not in unsubscribed] | recipients = [r for r in list(set(recipients)) if r and r not in unsubscribed] | ||||
email_content = formatted | |||||
email_text_context = text_content | email_text_context = text_content | ||||
if add_unsubscribe_link and reference_doctype and (unsubscribe_message or reference_doctype=="Newsletter") and add_unsubscribe_link==1: | |||||
should_append_unsubscribe = (add_unsubscribe_link | |||||
and reference_doctype | |||||
and (unsubscribe_message or reference_doctype=="Newsletter") | |||||
and add_unsubscribe_link==1) | |||||
unsubscribe_link = None | |||||
if should_append_unsubscribe or True: | |||||
unsubscribe_link = get_unsubscribe_message(unsubscribe_message, expose_recipients) | unsubscribe_link = get_unsubscribe_message(unsubscribe_message, expose_recipients) | ||||
email_content = email_content.replace("<!--unsubscribe link here-->", unsubscribe_link.html) | |||||
email_text_context += unsubscribe_link.text | email_text_context += unsubscribe_link.text | ||||
email_content = get_formatted_html(subject, message, | |||||
email_account=email_account, header=header, | |||||
unsubscribe_link=unsubscribe_link) | |||||
# add to queue | # add to queue | ||||
add(recipients, sender, subject, | add(recipients, sender, subject, | ||||
formatted=email_content, | formatted=email_content, | ||||
@@ -230,17 +236,21 @@ def get_emails_sent_this_month(): | |||||
status='Sent' and MONTH(creation)=MONTH(CURDATE())""")[0][0] | status='Sent' and MONTH(creation)=MONTH(CURDATE())""")[0][0] | ||||
def get_unsubscribe_message(unsubscribe_message, expose_recipients): | def get_unsubscribe_message(unsubscribe_message, expose_recipients): | ||||
if not unsubscribe_message: | |||||
unsubscribe_message = _("Unsubscribe from this list") | |||||
if unsubscribe_message: | |||||
unsubscribe_html = '''<a href="<!--unsubscribe url-->" | |||||
target="_blank">{0}</a>'''.format(unsubscribe_message) | |||||
else: | |||||
unsubscribe_link = '''<a href="<!--unsubscribe url-->" | |||||
target="_blank">{0}</a>'''.format(_('Unsubscribe')) | |||||
unsubscribe_html = _("{0} to stop receiving emails of this type").format(unsubscribe_link) | |||||
html = """<div style="margin: 15px auto; padding: 0px 7px; text-align: center; color: #8d99a6;"> | |||||
html = """<div class="email-unsubscribe"> | |||||
<!--cc message--> | <!--cc message--> | ||||
<p style="margin: 15px auto;"> | |||||
<a href="<!--unsubscribe url-->" style="color: #8d99a6; text-decoration: underline;" | |||||
target="_blank">{unsubscribe_message} | |||||
</a> | |||||
</p> | |||||
</div>""".format(unsubscribe_message=unsubscribe_message) | |||||
<div> | |||||
{0} | |||||
</div> | |||||
</div>""".format(unsubscribe_html) | |||||
if expose_recipients == "footer": | if expose_recipients == "footer": | ||||
text = "\n<!--cc message-->" | text = "\n<!--cc message-->" | ||||
else: | else: | ||||
@@ -48,6 +48,16 @@ hr { | |||||
.body-table.has-header .email-footer { | .body-table.has-header .email-footer { | ||||
border-top: none; | border-top: none; | ||||
} | } | ||||
.email-footer-container { | |||||
margin-top: 10px; | |||||
} | |||||
.email-footer-container > div:not(:last-child) { | |||||
margin-bottom: 5px; | |||||
} | |||||
.email-unsubscribe a { | |||||
color: #8D99A6; | |||||
text-decoration: underline; | |||||
} | |||||
.btn { | .btn { | ||||
text-decoration: none; | text-decoration: none; | ||||
padding: 7px 10px; | padding: 7px 10px; | ||||
@@ -63,6 +63,19 @@ hr { | |||||
} | } | ||||
} | } | ||||
.email-footer-container { | |||||
margin-top: 10px; | |||||
& > div:not(:last-child) { | |||||
margin-bottom: 5px; | |||||
} | |||||
} | |||||
.email-unsubscribe a { | |||||
color: @text-muted; | |||||
text-decoration: underline; | |||||
} | |||||
.btn { | .btn { | ||||
text-decoration: none; | text-decoration: none; | ||||
padding: 7px 10px; | padding: 7px 10px; | ||||
@@ -0,0 +1,29 @@ | |||||
<div class="email-footer-container text-muted"> | |||||
<!-- email_account_footer --> | |||||
{% if email_account_footer %} | |||||
<div class="email-account-footer"> | |||||
{{ email_account_footer }} | |||||
</div> | |||||
{% endif %} | |||||
<!-- company_address --> | |||||
{% if company_address %} | |||||
<div class="company-address"> | |||||
{% for line in company_address.splitlines(True) %} | |||||
<div>{{ line }}</div> | |||||
{% endfor %} | |||||
</div> | |||||
{% endif %} | |||||
<!--unsubscribe link here--> | |||||
<!-- default_mail_footer --> | |||||
{% if default_mail_footer %} | |||||
<div class="default-mail-footer"> | |||||
{% for line in default_mail_footer %} | |||||
<div>{{ line }}</div> | |||||
{% endfor %} | |||||
</div> | |||||
{% endif %} | |||||
</div> |