diff --git a/product/ERP5Type/ZopePatch.py b/product/ERP5Type/ZopePatch.py index a5bdcb60e040297dc841741be3a9cc16f7ef4c0e..96ee4b40ccc0a9548f31d18314db016e9adcd67e 100644 --- a/product/ERP5Type/ZopePatch.py +++ b/product/ERP5Type/ZopePatch.py @@ -56,7 +56,6 @@ from Products.ERP5Type.patches import PersistentMapping from Products.ERP5Type.patches import DateTimePatch from Products.ERP5Type.patches import PythonScript from Products.ERP5Type.patches import MailHost -from Products.ERP5Type.patches import MailTemplates from Products.ERP5Type.patches import http_server from Products.ERP5Type.patches import memcache_client from Products.ERP5Type.patches import StateChangeInfoPatch diff --git a/product/ERP5Type/patches/MailTemplates.py b/product/ERP5Type/patches/MailTemplates.py deleted file mode 100644 index ccfe7bffa2c345402eb9d669f1866ca0984fb9f2..0000000000000000000000000000000000000000 --- a/product/ERP5Type/patches/MailTemplates.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/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 - diff --git a/product/MailTemplates/BaseMailTemplate.py b/product/MailTemplates/BaseMailTemplate.py index 61abea4b996c5020a4d947b6eb817572e78a4afe..4c5938da5af87bfbb6e4aa4e8edda21716236281 100644 --- a/product/MailTemplates/BaseMailTemplate.py +++ b/product/MailTemplates/BaseMailTemplate.py @@ -9,8 +9,10 @@ import rfc822 from AccessControl import ClassSecurityInfo from DateTime import DateTime +from email.Header import Header from email.MIMEMultipart import MIMEMultipart 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.Common import package_home @@ -42,7 +44,11 @@ class BaseMailTemplate: self.getProperty('encoding', default_encoding)) 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') # now turn the result into a MIMEText object msg = MIMEText( @@ -73,16 +79,36 @@ class BaseMailTemplate: headers.get(header)))) if value is not None: values[key]=value + # turn some sequences in coma-seperated strings - if isinstance(value,tuple) or isinstance(value,list): + 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','subject'): + for param in ('mfrom','mto'): if not values.get(param): errors.append(param) if errors: @@ -92,6 +118,9 @@ class BaseMailTemplate: )) # add date header 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 keys = headers.keys() keys.sort()