[Erp5-report] r13523 - /erp5/trunk/products/ERP5/Document/MailMessage.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Tue Mar 20 15:39:58 CET 2007
Author: romain
Date: Tue Mar 20 15:39:56 2007
New Revision: 13523
URL: http://svn.erp5.org?rev=13523&view=rev
Log:
Test attributes have to be saved in utf-8 in ERP5, so, on the fly convertion is not needed.
In order to safely import mail in ERP5, use the postUTF8MailMessage method from
ERP5Type/patches/CMFMailIn.
getHeader was badly surcharged: it was not supposed to return a dict value.
It is forbidden to save dict attribute as a string.
Modified:
erp5/trunk/products/ERP5/Document/MailMessage.py
Modified: erp5/trunk/products/ERP5/Document/MailMessage.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/MailMessage.py?rev=13523&r1=13522&r2=13523&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/MailMessage.py (original)
+++ erp5/trunk/products/ERP5/Document/MailMessage.py Tue Mar 20 15:39:56 2007
@@ -39,32 +39,9 @@
from zLOG import LOG
-# TODO: support "from"/"to" field header QP decoding exemple:
-# =?iso-8859-15?q?K=E9vin=20De?= <kevin.de at 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'
@@ -87,143 +64,6 @@
, PropertySheet.Event
, 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):
"""
More information about the Erp5-report
mailing list