Commit 4b1a2fee authored by Romain Courteaud's avatar Romain Courteaud

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.


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@13523 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent a060361b
......@@ -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,
......
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