@@ -116,6 +116,7 @@ def init(site, sites_path=None): | |||||
local.module_app = None | local.module_app = None | ||||
local.app_modules = None | local.app_modules = None | ||||
local.system_settings = None | |||||
local.user = None | local.user = None | ||||
local.user_obj = None | local.user_obj = None | ||||
@@ -7,7 +7,7 @@ | |||||
{ | { | ||||
"fieldname": "localization", | "fieldname": "localization", | ||||
"fieldtype": "Section Break", | "fieldtype": "Section Break", | ||||
"label": "Localization", | |||||
"label": "", | |||||
"permlevel": 0 | "permlevel": 0 | ||||
}, | }, | ||||
{ | { | ||||
@@ -20,6 +20,12 @@ | |||||
"reqd": 1, | "reqd": 1, | ||||
"search_index": 0 | "search_index": 0 | ||||
}, | }, | ||||
{ | |||||
"fieldname": "column_break_3", | |||||
"fieldtype": "Column Break", | |||||
"permlevel": 0, | |||||
"precision": "" | |||||
}, | |||||
{ | { | ||||
"fieldname": "time_zone", | "fieldname": "time_zone", | ||||
"fieldtype": "Select", | "fieldtype": "Select", | ||||
@@ -30,7 +36,7 @@ | |||||
{ | { | ||||
"fieldname": "date_and_number_format", | "fieldname": "date_and_number_format", | ||||
"fieldtype": "Section Break", | "fieldtype": "Section Break", | ||||
"label": "Date and Number Format", | |||||
"label": "", | |||||
"permlevel": 0 | "permlevel": 0 | ||||
}, | }, | ||||
{ | { | ||||
@@ -41,6 +47,12 @@ | |||||
"permlevel": 0, | "permlevel": 0, | ||||
"reqd": 1 | "reqd": 1 | ||||
}, | }, | ||||
{ | |||||
"fieldname": "column_break_7", | |||||
"fieldtype": "Column Break", | |||||
"permlevel": 0, | |||||
"precision": "" | |||||
}, | |||||
{ | { | ||||
"fieldname": "number_format", | "fieldname": "number_format", | ||||
"fieldtype": "Select", | "fieldtype": "Select", | ||||
@@ -80,6 +92,12 @@ | |||||
"permlevel": 0, | "permlevel": 0, | ||||
"precision": "" | "precision": "" | ||||
}, | }, | ||||
{ | |||||
"fieldname": "column_break_13", | |||||
"fieldtype": "Column Break", | |||||
"permlevel": 0, | |||||
"precision": "" | |||||
}, | |||||
{ | { | ||||
"description": "Run scheduled jobs only if checked", | "description": "Run scheduled jobs only if checked", | ||||
"fieldname": "enable_scheduler", | "fieldname": "enable_scheduler", | ||||
@@ -96,11 +114,39 @@ | |||||
"permlevel": 0, | "permlevel": 0, | ||||
"precision": "", | "precision": "", | ||||
"report_hide": 1 | "report_hide": 1 | ||||
}, | |||||
{ | |||||
"fieldname": "email", | |||||
"fieldtype": "Section Break", | |||||
"label": "EMail", | |||||
"permlevel": 0, | |||||
"precision": "" | |||||
}, | |||||
{ | |||||
"description": "Your organization name and address for the email footer.", | |||||
"fieldname": "email_footer_address", | |||||
"fieldtype": "Small Text", | |||||
"label": "Email Footer Address", | |||||
"permlevel": 0, | |||||
"precision": "" | |||||
}, | |||||
{ | |||||
"fieldname": "column_break_18", | |||||
"fieldtype": "Column Break", | |||||
"permlevel": 0, | |||||
"precision": "" | |||||
}, | |||||
{ | |||||
"fieldname": "disable_standard_email_footer", | |||||
"fieldtype": "Check", | |||||
"label": "Disable Standard Email Footer", | |||||
"permlevel": 0, | |||||
"precision": "" | |||||
} | } | ||||
], | ], | ||||
"icon": "icon-cog", | "icon": "icon-cog", | ||||
"issingle": 1, | "issingle": 1, | ||||
"modified": "2015-05-18 05:11:38.759688", | |||||
"modified": "2015-05-21 07:15:55.682132", | |||||
"modified_by": "Administrator", | "modified_by": "Administrator", | ||||
"module": "Core", | "module": "Core", | ||||
"name": "System Settings", | "name": "System Settings", | ||||
@@ -72,13 +72,13 @@ def send(recipients=None, sender=None, subject=None, message=None, reference_doc | |||||
unsubscribe_method, unsubscribe_params) | unsubscribe_method, unsubscribe_params) | ||||
# add to queue | # add to queue | ||||
email_content = add_unsubscribe_link(email_content, email, reference_doctype, reference_name, | |||||
unsubscribe_url, unsubscribe_message) | |||||
email_content = add_unsubscribe_link(email_content, email, reference_doctype, | |||||
reference_name, unsubscribe_url, unsubscribe_message) | |||||
email_text_context += "\n" + _("Unsubscribe link: {0}").format(unsubscribe_url) | |||||
email_text_context += "\n" + _("This email was sent to {0}. To unsubscribe click on this link: {1}").format(email, unsubscribe_url) | |||||
add(email, sender, subject, email_content, email_text_context, reference_doctype, reference_name, attachments, reply_to, | |||||
cc, message_id, send_after) | |||||
add(email, sender, subject, email_content, email_text_context, reference_doctype, | |||||
reference_name, attachments, reply_to, cc, message_id, send_after) | |||||
def add(email, sender, subject, formatted, text_content=None, | def add(email, sender, subject, formatted, text_content=None, | ||||
reference_doctype=None, reference_name=None, attachments=None, reply_to=None, | reference_doctype=None, reference_name=None, attachments=None, reply_to=None, | ||||
@@ -121,11 +121,12 @@ def check_bulk_limit(recipients): | |||||
BulkLimitCrossedError) | BulkLimitCrossedError) | ||||
def add_unsubscribe_link(message, email, reference_doctype, reference_name, unsubscribe_url, unsubscribe_message): | def add_unsubscribe_link(message, email, reference_doctype, reference_name, unsubscribe_url, unsubscribe_message): | ||||
unsubscribe_link = """<div style="padding: 7px; margin-top: 7px;"> | |||||
<a href="{unsubscribe_url}" style="color: #8D99A6; text-decoration: none; font-size: 85%;" target="_blank"> | |||||
{unsubscribe_message} | |||||
unsubscribe_link = """<div style="padding: 7px; text-align: center;"> | |||||
<a href="{unsubscribe_url}" style="color: #8D99A6; text-decoration: none; | |||||
target="_blank">{email}. {unsubscribe_message}. | |||||
</a> | </a> | ||||
</div>""".format(unsubscribe_url = unsubscribe_url, | </div>""".format(unsubscribe_url = unsubscribe_url, | ||||
email= _("This email was sent to {0}").format(email), | |||||
unsubscribe_message = unsubscribe_message or _("Unsubscribe from this list")) | unsubscribe_message = unsubscribe_message or _("Unsubscribe from this list")) | ||||
message = message.replace("<!--unsubscribe link here-->", unsubscribe_link) | message = message.replace("<!--unsubscribe link here-->", unsubscribe_link) | ||||
@@ -73,13 +73,14 @@ | |||||
"icon": "icon-envelope", | "icon": "icon-envelope", | ||||
"idx": 1, | "idx": 1, | ||||
"in_create": 1, | "in_create": 1, | ||||
"modified": "2015-04-01 10:00:20.892939", | |||||
"modified": "2015-05-21 07:26:13.627637", | |||||
"modified_by": "Administrator", | "modified_by": "Administrator", | ||||
"module": "Email", | "module": "Email", | ||||
"name": "Bulk Email", | "name": "Bulk Email", | ||||
"owner": "Administrator", | "owner": "Administrator", | ||||
"permissions": [ | "permissions": [ | ||||
{ | { | ||||
"delete": 1, | |||||
"email": 1, | "email": 1, | ||||
"permlevel": 0, | "permlevel": 0, | ||||
"print": 1, | "print": 1, | ||||
@@ -5,7 +5,7 @@ from __future__ import unicode_literals | |||||
import frappe | import frappe | ||||
from frappe.utils.pdf import get_pdf | from frappe.utils.pdf import get_pdf | ||||
from frappe.email.smtp import get_outgoing_email_account | from frappe.email.smtp import get_outgoing_email_account | ||||
from frappe.utils.data import get_url, scrub_urls, strip, expand_relative_urls | |||||
from frappe.utils import get_url, scrub_urls, strip, expand_relative_urls, cint | |||||
import email.utils | import email.utils | ||||
from markdown2 import markdown | from markdown2 import markdown | ||||
@@ -232,10 +232,11 @@ def get_footer(footer=None): | |||||
if email_account and email_account.footer: | if email_account and email_account.footer: | ||||
footer += email_account.footer | footer += email_account.footer | ||||
else: | |||||
for default_mail_footer in frappe.get_hooks("default_mail_footer"): | |||||
footer += default_mail_footer | |||||
footer += "<!--unsubscribe link here-->" | footer += "<!--unsubscribe link here-->" | ||||
if not cint(frappe.db.get_default("disable_standard_email_footer")): | |||||
for default_mail_footer in frappe.get_hooks("default_mail_footer"): | |||||
footer += default_mail_footer | |||||
return footer | return footer |
@@ -5,9 +5,11 @@ | |||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||||
<title>{{ subject or "" }}</title> | <title>{{ subject or "" }}</title> | ||||
</head> | </head> | ||||
<body style="line-height: 1.6;"> | |||||
<body style="line-height: 1.5; color: #36414C;"> | |||||
<!-- body --> | <!-- body --> | ||||
<div style="font-family: Helvetica, Arial, sans-serif; font-size: 14px;">{{ content }}</div> | |||||
<div style="font-family: Helvetica, Arial, sans-serif; font-size: 14px; padding: 10px;"> | |||||
{{ content }} | |||||
</div> | |||||
<!-- footer --> | <!-- footer --> | ||||
<div class="email-footer" style="margin-top: 30px; font-family: Helvetica, Arial, sans-serif; font-size: 11px;" | <div class="email-footer" style="margin-top: 30px; font-family: Helvetica, Arial, sans-serif; font-size: 11px;" | ||||