diff --git a/product/ERP5/Document/MailMessage.py b/product/ERP5/Document/MailMessage.py index 2172451e33359e3f865da047814d2dd0f861651a..a7115c8d0887c99cc3897e410a7d948ed4de4094 100644 --- a/product/ERP5/Document/MailMessage.py +++ b/product/ERP5/Document/MailMessage.py @@ -39,32 +39,9 @@ import smtplib from zLOG import LOG -# TODO: support "from"/"to" field header QP decoding exemple: -# =?iso-8859-15?q?K=E9vin=20De?= <kevin.de@machin.com> - -# Support mail decoding in both python v2.3 and v2.4. -# See http://www.freesoft.org/CIE/RFC/1521/5.htm for 'content-transfer-encoding' explaination. -import binascii -try: - # python v2.3 API - from base64 import decodestring as b64decode -except AttributeError: - # python v2.4 API - from base64 import b64decode -global supported_decoding -supported_decoding = { - 'base64' : b64decode - , 'quoted-printable': binascii.a2b_qp - # "8bit", "7bit", and "binary" values all mean that NO encoding has been performed - , '8bit' : None - , '7bit' : None - , 'binary' : None - } - - class MailMessage(Event, CMFMailInMessage): """ - MailMessage subclasses Event objects to implement Email Events. + MailMessage subclasses Event objects to implement Email Events. """ meta_type = 'ERP5 Mail Message' @@ -88,143 +65,6 @@ class MailMessage(Event, CMFMailInMessage): , PropertySheet.MailMessage ) - # default empty attributes - header = '{}' - body = '' - -####### TODO: support attachments !!!! -# def __init__(self, *args, **kw): -# XMLObject.__init__(self, *args, **kw) -# # Save attachments in a special variable -# attachments = kw.get('attachments', {}) -# if kw.has_key('attachments'): -# del kw['attachments'] -# self.attachments = attachments - - def _edit(self, *args, **kw): - Event._edit(self, *args, **kw) - self.cleanMessage() - - def cleanMessage(self): - """ - Clean up the the message data to have UTF-8 encoded body and a clean header. - """ - # Update the body to the clean one - self.body = self.getBody() - # Update the charset and the encoding since the body is known has 'cleaned' - header = self.getHeader() - if header != None: - header = self.setBodyCharsetFromDict(header, charset="utf-8") - header['content-transfer-encoding'] = "binary" - self.header = header - - def getDecodedBody(self, raw_body, encoding): - """ - This method return a decoded body according the given parameter. - This method use the global "supported_decoding" dict which contain decoded - methods supported by the current python environnment. - """ - decoded_body = raw_body - if encoding in supported_decoding.keys(): - method = supported_decoding[encoding] - # Is the body encoded ? - if method != None: - decoded_body = method(raw_body) - elif encoding not in (None, ''): - raise 'MailMessage Body Decoding Error', "Body encoding '%s' is not supported" % (encoding) - return decoded_body - - def getEncodedBody(self, body, output_charset="utf-8"): - """ - Return the entire body message encoded in the given charset. - """ - header = self.getHeader() - body_charset = self.getBodyCharsetFromDict(header) - if body_charset != None and body_charset.lower() != output_charset.lower(): - unicode_body = unicode(body, body_charset) - return unicode_body.encode(output_charset) - return body - - def getBodyEncodingFromDict(self, header={}): - """ - Extract the encoding of the body from header metadatas. - """ - encoding = None - if type(header) == type({}) and header.has_key('content-transfer-encoding'): - encoding = header['content-transfer-encoding'] - return encoding - - def getBodyCharsetFromDict(self, header): - """ - Extract the charset from the header. - """ - charset = "utf-8" - if header != None and header.has_key('content-type'): - content_type = header['content-type'].replace('\n', ' ') - content_type_info = content_type.split(';') - for ct_info in content_type_info: - info = ct_info.strip().lower() - if info.startswith('charset='): - charset = info[len('charset='):] - # Some charset statements are quoted - if charset.startswith('"') or charset.startswith("'"): charset = charset[1:] - if charset.endswith( '"') or charset.endswith( "'"): charset = charset[:-1] - break - return charset - - def setBodyCharsetFromDict(self, header, charset): - """ - This method update charset info of the body. - """ - if header != None: - # Update content-type where charset is stored - content_type_info = [] - if header.has_key('content-type'): - content_type = header['content-type'].replace('\n', ' ') - content_type_info = content_type.split(';') - # Force content-type charset to UTF-8 - new_content_type_metadata = [] - # Get previous info - for ct_info in content_type_info: - info = ct_info.strip().lower() - # Bypass previous charset info - if not info.startswith('charset='): - new_content_type_metadata.append(ct_info.strip()) - # Add a new charset info consistent with the actual body charset encoding - new_content_type_metadata.append("charset='%s'" % (charset)) - # Inject new content-type in the header - header['content-type'] = ";\n ".join(new_content_type_metadata) - return header - - def updateCharset(self, charset="utf-8"): - """ - This method update charset info stored in the header. - Usefull to manually debug bad emails. - """ - header = self.getHeader() - self.header = self.setBodyCharsetFromDict(header, charset) - - def getHeader(self): - """ - Get the header dict of the message. - """ - header = self.header - if header == None or type(header) == type({}): - return header - elif type(header) == type(''): - # Must do an 'eval' because the header is a dict stored as a text (see ERP5/PropertySheet/MailMessage.py) - return eval(header) - else: - raise 'TypeError', "Type of 'header' property can't be guessed." - - def getBody(self): - """ - Get a clean decoded body. - """ - encoding = self.getBodyEncodingFromDict(self.getHeader()) - body_string = self.getDecodedBody(self.body, encoding) - return self.getEncodedBody(body_string, output_charset="utf-8") - def getReplyBody(self): """ This is used in order to respond to a mail,