diff --git a/product/ERP5/Document/MailMessage.py b/product/ERP5/Document/MailMessage.py index b29641415dc4b32e6e516995af8ee07d6bdb4a3f..b78cca3a89b0066eb0953f240dc380deee23afbc 100755 --- a/product/ERP5/Document/MailMessage.py +++ b/product/ERP5/Document/MailMessage.py @@ -1,7 +1,8 @@ ############################################################################## # -# Copyright (c) 2002 Nexedi SARL and Contributors. All Rights Reserved. -# Jean-Paul Smets-Solanes <jp@nexedi.com> +# Copyright (c) 2002-2006 Nexedi SARL and Contributors. All Rights Reserved. +# Jean-Paul Smets-Solanes <jp@nexedi.com> +# Kevin Deldycke <kevin@nexedi.com> # # WARNING: This program as such is intended to be used by professional # programmers who take the whole responsability of assessing all potential @@ -39,79 +40,102 @@ import smtplib from zLOG import LOG +# API of base64 has changed between python v2.3 and v2.4 +import base64 +global supported_encoding +supported_encoding = {} +try: + # python v2.4 API + supported_encoding = { 'base64': base64.b64decode + , 'base32': base64.b32decode + , 'base16': base64.b16decode + } +except AttributeError: + # python v2.3 API + supported_encoding = { 'base64': base64.decodestring + } + + class MailMessage(XMLObject, Event, CMFMailInMessage): + """ + MailMessage subclasses Event objects to implement Email Events. + """ + + meta_type = 'ERP5 Mail Message' + portal_type = 'Mail Message' + add_permission = Permissions.AddPortalContent + isPortalContent = 1 + isRADContent = 1 + + # Declarative security + security = ClassSecurityInfo() + security.declareObjectProtected(Permissions.AccessContentsInformation) + + # Declarative properties + property_sheets = ( PropertySheet.Base + , PropertySheet.XMLObject + , PropertySheet.DublinCore + , PropertySheet.Task + , PropertySheet.Arrow + , PropertySheet.MailMessage + ) + + def __init__(self, *args, **kw): + XMLObject.__init__(self, *args, **kw) + self.attachments = attachments + + def _edit(self, *args, **kw): + # LOG('MailMessage._edit', 0, str(kw)) + self._cleanIncomingMessage(**kw) + XMLObject._edit(self, *args, **kw) + self.attachments = attachments + + def _cleanIncomingMessage(**kw): + # Delete attachments + attachments = kw.get('attachments', {}) + if kw.has_key('attachments'): + del kw['attachments'] + # Decode MIME base64/32/16 data + if kw.has_key('header') and kw['header'].has_key('content-transfer-encoding'): + content_encoding = kw['header']['content-transfer-encoding'] + if content_encoding in supported_encoding.keys(): + method = supported_encoding[content_encoding] + kw['body'] = method(kw['body']) + del kw['header']['content-transfer-encoding'] + + def send(self, from_url=None, to_url=None, msg=None, subject=None): """ - MailMessage subclasses Event objects to implement Email Events. + Sends a reply to this mail message. """ + # We assume by default that we are replying to the sender + if from_url == None: + from_url = self.getUrlString() + if to_url == None: + to_url = self.getSender() + if msg is not None and subject is not None: + header = "From: %s\n" % from_url + header += "To: %s\n\n" % to_url + header += "Subject: %s\n" % subject + header += "\n" + msg = header + msg + self.MailHost.send( msg ) - meta_type = 'ERP5 Mail Message' - portal_type = 'Mail Message' - add_permission = Permissions.AddPortalContent - isPortalContent = 1 - isRADContent = 1 - - # Declarative security - security = ClassSecurityInfo() - security.declareObjectProtected(Permissions.AccessContentsInformation) - - # Declarative properties - property_sheets = ( PropertySheet.Base - , PropertySheet.XMLObject - , PropertySheet.DublinCore - , PropertySheet.Task - , PropertySheet.Arrow - , PropertySheet.MailMessage - ) - - def __init__(self, *args, **kw): - attachments = kw.get('attachments', {}) - if kw.has_key('attachments'): - del kw['attachments'] - XMLObject.__init__(self, *args, **kw) - self.attachments = attachments - - def _edit(self, *args, **kw): - LOG('MailMessage._edit', 0, str(kw)) - attachments = kw.get('attachments', {}) - if kw.has_key('attachments'): - del kw['attachments'] - XMLObject._edit(self, *args, **kw) - self.attachments = attachments - - def send(self, from_url=None, to_url=None, msg=None, subject=None): - """ - Sends a reply to this mail message. - """ - # We assume by default that we are replying to the sender - if from_url == None: - from_url = self.getUrlString() - if to_url == None: - to_url = self.getSender() - if msg is not None and subject is not None: - header = "From: %s\n" % from_url - header += "To: %s\n\n" % to_url - header += "Subject: %s\n" % subject - header += "\n" - msg = header + msg - self.MailHost.send( msg ) - - def getReplyBody(self): - """ + def getReplyBody(self): + """ This is used in order to respond to a mail, this put a '> ' before each line of the body - """ - reply_body = '' - if type(self.body) is type('a'): - reply_body = '> ' + self.body.replace('\n','\n> ') - return reply_body - - def getReplySubject(self): - """ + """ + reply_body = '' + if type(self.body) is type('a'): + reply_body = '> ' + self.body.replace('\n','\n> ') + return reply_body + + def getReplySubject(self): + """ This is used in order to respond to a mail, this put a 'Re: ' before the orignal subject - """ - reply_subject = self.getTitle() - if reply_subject.find('Re: ')!=0: - reply_subject = 'Re: ' + reply_subject - return reply_subject - + """ + reply_subject = self.getTitle() + if reply_subject.find('Re: ')!=0: + reply_subject = 'Re: ' + reply_subject + return reply_subject