diff --git a/frappe/__version__.py b/frappe/__version__.py index b7fdf1768e..9e34cf6085 100644 --- a/frappe/__version__.py +++ b/frappe/__version__.py @@ -1,2 +1,2 @@ from __future__ import unicode_literals -__version__ = "6.27.12" +__version__ = "6.27.13" diff --git a/frappe/email/email_body.py b/frappe/email/email_body.py index 6f71085655..7568d49821 100644 --- a/frappe/email/email_body.py +++ b/frappe/email/email_body.py @@ -5,7 +5,8 @@ from __future__ import unicode_literals import frappe from frappe.utils.pdf import get_pdf from frappe.email.smtp import get_outgoing_email_account -from frappe.utils import get_url, scrub_urls, strip, expand_relative_urls, cint, split_emails, to_markdown, markdown +from frappe.utils import (get_url, scrub_urls, strip, expand_relative_urls, cint, + split_emails, to_markdown, markdown, encode) import email.utils def get_email(recipients, sender='', msg='', subject='[No Subject]', @@ -176,7 +177,8 @@ class EMail: def replace_sender(self): if cint(self.email_account.always_use_account_email_id_as_sender): - self.original_sender = self.sender + self.set_header('X-Original-From', self.sender) + sender_name, sender_email = email.utils.parseaddr(self.sender) self.sender = email.utils.formataddr((sender_name or self.email_account.name, self.email_account.email_id)) @@ -190,28 +192,32 @@ class EMail: def make(self): """build into msg_root""" headers = { - "Subject": strip(self.subject).encode("utf-8"), - "From": self.sender.encode("utf-8"), - "To": ', '.join(self.recipients).encode("utf-8"), + "Subject": strip(self.subject), + "From": self.sender, + "To": ', '.join(self.recipients), "Date": email.utils.formatdate(), - "Reply-To": self.reply_to.encode("utf-8") if self.reply_to else None, - "CC": ', '.join(self.cc).encode("utf-8") if self.cc else None, - b'X-Frappe-Site': get_url().encode('utf-8'), + "Reply-To": self.reply_to if self.reply_to else None, + "CC": ', '.join(self.cc) if self.cc else None, + 'X-Frappe-Site': get_url(), } - if cint(self.email_account.always_use_account_email_id_as_sender) and hasattr(self, 'original_sender'): - headers[b'X-Original-From'] = self.original_sender.encode('utf-8') - # reset headers as values may be changed. for key, val in headers.iteritems(): - if self.msg_root.has_key(key): - del self.msg_root[key] - self.msg_root[key] = val + self.set_header(key, val) # call hook to enable apps to modify msg_root before sending for hook in frappe.get_hooks("make_email_body_message"): frappe.get_attr(hook)(self) + def set_header(self, key, value): + key = encode(key) + value = encode(value) + + if self.msg_root.has_key(key): + del self.msg_root[key] + + self.msg_root[key] = value + def as_string(self): """validate, build message and convert to string""" self.validate() diff --git a/frappe/hooks.py b/frappe/hooks.py index d97157e5ec..89890c8733 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -5,7 +5,7 @@ app_publisher = "Frappe Technologies" app_description = "Full stack web framework with Python, Javascript, MariaDB, Redis, Node" app_icon = "octicon octicon-circuit-board" -app_version = "6.27.12" +app_version = "6.27.13" app_color = "orange" source_link = "https://github.com/frappe/frappe" app_license = "MIT" diff --git a/setup.py b/setup.py index 32b17bc051..315f27050f 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from setuptools import setup, find_packages from pip.req import parse_requirements -version = "6.27.12" +version = "6.27.13" requirements = parse_requirements("requirements.txt", session="") setup(