|
|
@@ -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() |
|
|
|