Commit bf7d1f9a authored by Julien Muchembled's avatar Julien Muchembled Committed by Eteri

MailTemplates: merge monkey-patch

parent 4fd52ea0
...@@ -56,7 +56,6 @@ from Products.ERP5Type.patches import PersistentMapping ...@@ -56,7 +56,6 @@ from Products.ERP5Type.patches import PersistentMapping
from Products.ERP5Type.patches import DateTimePatch from Products.ERP5Type.patches import DateTimePatch
from Products.ERP5Type.patches import PythonScript from Products.ERP5Type.patches import PythonScript
from Products.ERP5Type.patches import MailHost from Products.ERP5Type.patches import MailHost
from Products.ERP5Type.patches import MailTemplates
from Products.ERP5Type.patches import http_server from Products.ERP5Type.patches import http_server
from Products.ERP5Type.patches import memcache_client from Products.ERP5Type.patches import memcache_client
from Products.ERP5Type.patches import StateChangeInfoPatch from Products.ERP5Type.patches import StateChangeInfoPatch
......
#!/usr/bin/python
# Copyright (c) 2005 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.
"""
this patch is based on MailTemplates 1.1.0
it will only try to encode() text if it's of type unicode
"""
try:
from Products.MailTemplates import BaseMailTemplate
except ImportError:
BaseMailTemplate = None
from email.Header import Header
from email.Utils import make_msgid, formataddr, getaddresses
if BaseMailTemplate is not None:
def _process_utf8(self,kw):
# sort out what encoding we're going to use
encoding = kw.get('encoding',
self.getProperty('encoding',
BaseMailTemplate.default_encoding))
text = self.__class__.__bases__[1].__call__(self,**kw)
# ZPT adds newline at the end, but it breaks backward compatibility.
# So I remove it.
if text and text[-1]=='\n':
text = text[:-1]
if not self.html() and isinstance(text, unicode):
text = text.encode(encoding,'replace')
# now turn the result into a MIMEText object
msg = BaseMailTemplate.MIMEText(
text.replace('\r',''),
self.content_type.split('/')[1],
encoding
)
# sort out what headers and addresses we're going to use
headers = {}
values = {}
# headers from the headers property
for header in getattr(self,'headers',()):
name,value = header.split(':',1)
headers[name]=value
# headers from the headers parameter
headers_param = kw.get('headers',{})
headers.update(headers_param)
# values and some specific headers
for key,header in (('mfrom','From'),
('mto','To'),
('mcc','Cc'),
('mbcc','Bcc'),
('subject','Subject')):
value = kw.get(key,
headers_param.get(header,
getattr(self,
key,
headers.get(header))))
if value is not None:
values[key]=value
# turn some sequences in coma-seperated strings
if isinstance(value, (tuple, list)):
value = ', '.join(value)
# make sure we have no unicode headers
if isinstance(value,unicode):
value = value.encode(encoding)
if key == 'subject':
try:
# Try to keep header non encoded
value = Header(value.encode("ascii"))
except UnicodeDecodeError:
value = Header(value, "UTF-8")
else:
value_list = getaddresses([value])
dest_list = []
for name, email in value_list:
try:
name = Header(name.encode("ascii"))
except UnicodeDecodeError:
name = Header(name, "UTF-8")
dest_list.append(formataddr((name.encode(), email)))
value = ", ".join(dest_list)
headers[header]=value
# check required values have been supplied
errors = []
for param in ('mfrom','mto'):
if not values.get(param):
errors.append(param)
if errors:
raise TypeError(
'The following parameters were required by not specified: '+(
', '.join(errors)
))
# add date header
headers['Date']=BaseMailTemplate.DateTime().rfc822()
# add message-id header
headers['Message-ID']=make_msgid()
# turn headers into an ordered list for predictable header order
keys = headers.keys()
keys.sort()
return msg,values,[(key,headers[key]) for key in keys]
BaseMailTemplate.BaseMailTemplate._process = _process_utf8
...@@ -9,8 +9,10 @@ import rfc822 ...@@ -9,8 +9,10 @@ import rfc822
from AccessControl import ClassSecurityInfo from AccessControl import ClassSecurityInfo
from DateTime import DateTime from DateTime import DateTime
from email.Header import Header
from email.MIMEMultipart import MIMEMultipart from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText from email.MIMEText import MIMEText
from email.Utils import make_msgid, formataddr, getaddresses
from App.class_init import default__class_init__ as InitializeClass from App.class_init import default__class_init__ as InitializeClass
from App.Common import package_home from App.Common import package_home
...@@ -42,7 +44,11 @@ class BaseMailTemplate: ...@@ -42,7 +44,11 @@ class BaseMailTemplate:
self.getProperty('encoding', self.getProperty('encoding',
default_encoding)) default_encoding))
text = self.__class__.__bases__[1].__call__(self,**kw) text = self.__class__.__bases__[1].__call__(self,**kw)
if not self.html(): # ZPT adds newline at the end, but it breaks backward compatibility.
# So I remove it.
if text.endswith('\n'):
text = text[:-1]
if not self.html() and isinstance(text, unicode):
text = text.encode(encoding,'replace') text = text.encode(encoding,'replace')
# now turn the result into a MIMEText object # now turn the result into a MIMEText object
msg = MIMEText( msg = MIMEText(
...@@ -73,16 +79,36 @@ class BaseMailTemplate: ...@@ -73,16 +79,36 @@ class BaseMailTemplate:
headers.get(header)))) headers.get(header))))
if value is not None: if value is not None:
values[key]=value values[key]=value
# turn some sequences in coma-seperated strings # turn some sequences in coma-seperated strings
if isinstance(value,tuple) or isinstance(value,list): if isinstance(value, (tuple, list)):
value = ', '.join(value) value = ', '.join(value)
# make sure we have no unicode headers # make sure we have no unicode headers
if isinstance(value,unicode): if isinstance(value,unicode):
value = value.encode(encoding) value = value.encode(encoding)
if key == 'subject':
try:
# Try to keep header non encoded
value = Header(value.encode("ascii"))
except UnicodeDecodeError:
value = Header(value, "UTF-8")
else:
value_list = getaddresses([value])
dest_list = []
for name, email in value_list:
try:
name = Header(name.encode("ascii"))
except UnicodeDecodeError:
name = Header(name, "UTF-8")
dest_list.append(formataddr((name.encode(), email)))
value = ", ".join(dest_list)
headers[header]=value headers[header]=value
# check required values have been supplied # check required values have been supplied
errors = [] errors = []
for param in ('mfrom','mto','subject'): for param in ('mfrom','mto'):
if not values.get(param): if not values.get(param):
errors.append(param) errors.append(param)
if errors: if errors:
...@@ -92,6 +118,9 @@ class BaseMailTemplate: ...@@ -92,6 +118,9 @@ class BaseMailTemplate:
)) ))
# add date header # add date header
headers['Date']=DateTime().rfc822() headers['Date']=DateTime().rfc822()
# do not let the MTA to generate the Message-ID:
# we want to have it stored in ERP5, for mail threading
headers['Message-ID'] = make_msgid()
# turn headers into an ordered list for predictable header order # turn headers into an ordered list for predictable header order
keys = headers.keys() keys = headers.keys()
keys.sort() keys.sort()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment