- checkin of previous plc sendmail.py
authorTony Mack <tmack@cs.princeton.edu>
Fri, 5 Jan 2007 16:12:12 +0000 (16:12 +0000)
committerTony Mack <tmack@cs.princeton.edu>
Fri, 5 Jan 2007 16:12:12 +0000 (16:12 +0000)
PLC/sendmail.py [new file with mode: 0644]

diff --git a/PLC/sendmail.py b/PLC/sendmail.py
new file mode 100644 (file)
index 0000000..408f2cb
--- /dev/null
@@ -0,0 +1,144 @@
+import smtplib
+import string
+import sys
+import time
+
+from PLC.Faults import *
+
+"""
+used to send out emails - sets up the headers correctly
+"""
+class sendmail:
+
+    def __init__(self, config):
+
+       self.MAIL_ENABLED = config.PLC_MAIL_ENABLED
+
+        self.SMTP_SERVER= 'localhost'
+    
+        self.X_MAILER= 'PlanetLab API Mailer'
+
+
+    """
+    open up a connect to our mail server, and send out a message.
+
+    the email addresses are not verified before sending out the message.
+
+    to_addr_list, cc_addr_list, and from_addr should be a dictionary, with the keys
+    being the email address and the value being the plain text name of
+    the recipient. only the first key from from_addr will be used, so it should
+    contain only one address.
+
+    subject is not checked for multiple lines - ensure it is only one.
+    """
+    def mail( self, to_addr_list, cc_addr_list, from_addr, subject, content ):
+
+       if self.MAIL_ENABLED == 0:
+            return 1
+        
+        server= smtplib.SMTP(self.SMTP_SERVER)
+
+        str_date= time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
+
+        str_from_addr= self.create_recipient_list(from_addr,1)
+        str_to_addr= self.create_recipient_list(to_addr_list)
+
+        full_message  = ""
+        full_message += "Content-type: text/plain; charset=iso-8859-1\r\n"
+        full_message += "Date: %s\r\n" % str_date
+        full_message += "MIME-Version: 1.0\r\n"
+
+        full_message += "To: %s\r\n" % str_to_addr
+        full_message += "From: %s\r\n" % str_from_addr
+        
+        if cc_addr_list is not None and len(cc_addr_list) > 0:
+            str_cc_addr= self.create_recipient_list(cc_addr_list)
+            full_message += "Cc: %s\r\n" % str_cc_addr
+
+        full_message += "Subject: %s\r\n" % subject
+        full_message += "Reply-To: %s\r\n" % str_from_addr
+        full_message += "X-Mailer: %s\r\n\r\n" % self.X_MAILER        
+        full_message += content
+
+        try:
+            # get just a list of to recipients (needed for envelope). this
+            # needs to include all reciepients, including Cc
+            local_to_list= to_addr_list.copy()
+
+            if cc_addr_list is not None:
+                local_to_list.update( cc_addr_list )
+                
+            all_to_addr_list= self.create_recipient_list(local_to_list,
+                                                         return_string=0)
+            
+            # send out the mail!
+           rc= server.sendmail(str_from_addr, all_to_addr_list, full_message )
+
+           return 1
+        
+        except smtplib.SMTPRecipientsRefused, err:
+            sys.stderr.write( "SMTPRecipientsRefused: %s" % repr(err) )
+            return 0
+        
+        except smtplib.SMTPHeloError:
+            sys.stderr.write( "SMTPHeloError: %s" % repr(err) )
+            return 0
+        
+        except smtplib.SMTPSenderRefused:
+            sys.stderr.write( "SMTPSenderRefused: %s" % repr(err) )
+            return 0
+        
+        except smtplib.SMTPDataError:
+            sys.stderr.write( "SMTPDataError: %s" % repr(err) )
+            return 0
+        
+
+
+
+
+    """
+    accepts a list of email recipient as a dictionary in the same format
+    as the mail function, and returns it in a format suitable for use in
+    an email message. for example:
+
+    if limit is specified, only limit number of entries from
+    addr_list is used. which one is used is not defined, so it is really only
+    useful to make sure that the result has a single entry (for from lines)
+
+    for return_string= 1:
+      input: {'user@domain.com': 'A User','test@planet-lab.org': 'PL User'}
+      ouput: 'A User <user@domain.com>, PL User <test@planet-lab.org>'
+    otherwise:
+      input: {'user@domain.com': 'A User','test@planet-lab.org': 'PL User'}
+      ouput: ['A User <user@domain.com>', 'PL User <test@planet-lab.org>']
+  
+    """
+    def create_recipient_list( self, addr_list, return_string= 1, limit= None ):
+        if not isinstance(addr_list,dict):
+            raise PLCAPIError, \
+                  "Internal error, call to create_recipient_list " \
+                  "with non-dict addr_list (%s)." % str(addr_list)
+        
+        if limit == None:
+            limit= len(addr_list.keys())
+
+        if limit <= 0:
+            return ''
+
+        recipients= []
+        total= 0
+        
+        for email in addr_list.keys():
+            recipients = recipients + ['%s <%s>' % (addr_list[email],email)]
+            total= total+1
+            if total == limit:
+                break
+
+        if return_string == 1:
+            return string.join( recipients, ", " )
+        else:
+            return recipients
+
+    
+        
+