[Erp5-report] r6578 - /erp5/trunk/products/ERP5/Document/Url.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Thu Apr 13 14:05:54 CEST 2006
Author: aurel
Date: Thu Apr 13 14:05:44 2006
New Revision: 6578
URL: http://svn.erp5.org?rev=6578&view=rev
Log:
rewrite send method to allow to used attachment file
Modified:
erp5/trunk/products/ERP5/Document/Url.py
Modified: erp5/trunk/products/ERP5/Document/Url.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/Url.py?rev=6578&r1=6577&r2=6578&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/Url.py (original)
+++ erp5/trunk/products/ERP5/Document/Url.py Thu Apr 13 14:05:44 2006
@@ -27,69 +27,133 @@
##############################################################################
from AccessControl import ClassSecurityInfo
-
from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface
from Products.ERP5Type.Base import Base
+from Products.ERP5.Document.Coordinate import Coordinate
+from cStringIO import StringIO
+from MimeWriter import MimeWriter
+from base64 import encode
+from mimetools import choose_boundary
+from mimetypes import guess_type
-from Products.ERP5.Document.Coordinate import Coordinate
class Url(Coordinate, Base):
- """
- A Url is allows to represent in a standard way coordinates
- such as web sites, emails, ftp sites, etc.
- """
+ """
+ A Url is allows to represent in a standard way coordinates
+ such as web sites, emails, ftp sites, etc.
+ """
- meta_type = 'ERP5 Url'
- portal_type = 'Url'
- add_permission = Permissions.AddPortalContent
- isPortalContent = 1
- isRADContent = 1
+ meta_type = 'ERP5 Url'
+ portal_type = 'Url'
+ add_permission = Permissions.AddPortalContent
+ isPortalContent = 1
+ isRADContent = 1
- # Declarative security
- security = ClassSecurityInfo()
- security.declareObjectProtected(Permissions.AccessContentsInformation)
+ # Declarative security
+ security = ClassSecurityInfo()
+ security.declareObjectProtected(Permissions.AccessContentsInformation)
- # Default Properties
- property_sheets = ( PropertySheet.Base
+ # Default Properties
+ property_sheets = ( PropertySheet.Base
, PropertySheet.SimpleItem
, PropertySheet.Url
)
- security.declareProtected(Permissions.AccessContentsInformation,
- 'asText')
- def asText(self):
- return self.url_string
+ security.declareProtected(Permissions.AccessContentsInformation,
+ 'asText')
+ def asText(self):
+ return self.url_string
- security.declareProtected(Permissions.ModifyPortalContent, 'fromText')
- def fromText(self, text):
- self.url_string = text
+ security.declareProtected(Permissions.ModifyPortalContent, 'fromText')
+ def fromText(self, text):
+ self.url_string = text
- security.declareProtected(Permissions.AccessContentsInformation,
- 'standardTextFormat')
- def standardTextFormat(self):
- """
- Returns the standard text formats for urls
- """
- return ("http://www.erp5.org","mailto:info@erp5.org")
-
- def send(self, from_url=None, to_url=None, msg=None, subject=None):
- """
- This method was previously named 'SendMail'
+ security.declareProtected(Permissions.AccessContentsInformation,
+ 'standardTextFormat')
+ def standardTextFormat(self):
+ """
+ Returns the standard text formats for urls
+ """
+ return ("http://www.erp5.org","mailto:info@erp5.org")
- Send An Email
- """
- # If no URL is specified, use ourselves
- if from_url == None:
- from_url = self.getUrlString()
- if to_url == None:
- to_url = self.getUrlString()
- if to_url.find('@')>=0: # We will send an email
- if msg is not None and subject is not None:
- header = "From: %s\n" % from_url
- header += "To: %s\n" % to_url
- header += "Subject: %s\n" % subject
- header += "\n"
- msg = header + msg
- self.getPortalObject().MailHost.send( msg )
+ def send(self, from_url=None, to_url=None, msg=None, subject=None, attachment_list=None):
+ """
+ This method was previously named 'SendMail' and is used to send email
+ attachment_list is a list of dictionnary wich has keys :
+ - name : name of the attachment,
+ - content: data of the attachment
+ - mime_type: mime-type corresponding to the attachment
+ """
+ # get the mailhost object
+ try:
+ mailhost=self.getPortalObject().MailHost
+ except:
+ raise AttributeError, "Cannot find a Mail Host object"
+ else:
+ if from_url is None:
+ from_url = self.getUrlString(None)
+ if to_url is None:
+ to_url = self.getUrlString(None)
+ if from_url is None or to_url is None:
+ raise AttributeError, "No mail defined"
+
+ # Create multi-part MIME message.
+ message = StringIO()
+ writer = MimeWriter(message)
+ writer.addheader('From', from_url)
+ writer.addheader('To', to_url)
+ writer.addheader('Subject', subject)
+ writer.addheader('MimeVersion', '1.0')
+ # Don't forget to flush the headers for Communicator
+ writer.flushheaders()
+ # Generate a unique section boundary:
+ outer_boundary = choose_boundary()
+ # Start the main message body. Write a brief message
+ # for non-MIME-capable readers:
+ dummy_file=writer.startmultipartbody("mixed",outer_boundary)
+ dummy_file.write("If you can read this, your mailreader\n")
+ dummy_file.write("can not handle multi-part messages!\n")
+
+ submsg = writer.nextpart()
+ submsg.addheader("Content-Transfer-Encoding", "7bit")
+ FirstPartFile=submsg.startbody("text/plain", [("charset","US-ASCII")])
+ FirstPartFile.write(msg)
+
+ if attachment_list!=None:
+ for attachment in attachment_list:
+ if attachment.has_key('name'):
+ attachment_name = attachment['name']
+ else:
+ attachment_name = ''
+ # try to guess the mime type
+ if not attachment.has_key('mime_type'):
+ type, encoding = guess_type( attachment_name )
+ if type != None:
+ attachment['mime_type'] = type
+ else:
+ attachment['mime_type'] = 'application/octet-stream'
+ # attach it
+ submsg = writer.nextpart()
+ if attachment['mime_type'] == 'text/plain':
+ attachment_file = StringIO(attachment['content'] )
+ submsg.addheader("Content-Transfer-Encoding", "7bit")
+ submsg.addheader("Content-Disposition", "attachment;\nfilename="+attachment_name)
+ submsg.flushheaders()
+
+ f = submsg.startbody(attachment['mime_type'] , [("name", attachment_name)])
+ f.write(attachment_file.getvalue())
+ else:
+ # encode non-plaintext attachment in base64
+ attachment_file = StringIO(attachment['content'] )
+ submsg.addheader("Content-Transfer-Encoding", "base64")
+ submsg.flushheaders()
+
+ f = submsg.startbody(attachment['mime_type'] , [("name", attachment_name)])
+ encode(attachment_file, f)
+ # close the writer
+ writer.lastpart()
+ # send mail to user
+ mailhost.send(message.getvalue(), to_url, from_url)
+ return None
More information about the Erp5-report
mailing list