You are viewing a plain text version of this content. The canonical link for it is here.
Posted to general@gump.apache.org by aj...@apache.org on 2003/10/21 18:15:53 UTC

cvs commit: jakarta-gump/python/gump model.py nag.py mailer.py conf.py

ajack       2003/10/21 09:15:53

  Modified:    python/gump model.py nag.py mailer.py conf.py
  Log:
  Major updates to mailing and nagging:
  
  1) Env TO/FROM comes from gump@`hostname`, body TO/FROM from nag info.
  2) Cope w/ e-mail addresses X X <xxxx> in envelopes
  3) Allow SMTP to other ports
  4) Added some tests.
  
  Revision  Changes    Path
  1.39      +16 -4     jakarta-gump/python/gump/model.py
  
  Index: model.py
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/python/gump/model.py,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- model.py	20 Oct 2003 23:58:37 -0000	1.38
  +++ model.py	21 Oct 2003 16:15:52 -0000	1.39
  @@ -141,11 +141,23 @@
       if self.deliver:
         if not self.scratchdir: self.scratchdir=os.path.join(self.basedir,"scratch")
   
  +    # Allow per workspace overrides
  +    
       if not self.logurl: self.logurl = default.logurl
  +    # Sending e-mail address
       if not self.email: self.email = default.email
  -    if not self.mailinglist: self.mailinglist = default.mailinglist
  +    # Sending server
  +    if not self.mailinglist: self.mailinglist = default.mailinglist    
  +    # Mail server
       if not self.mailserver: self.mailserver = default.mailserver
  +    # Get mailport as an int
  +    if not self.mailport: 
  +        self.mailport = default.mailport
  +    else:
  +        self.mailport = int(self.mailport)
  +    # Mail subject prefix
       if not self.prefix: self.prefix = default.prefix
  +    # Mail .sig
       if not self.signature: self.signature = default.signature
   
       
  
  
  
  1.19      +32 -26    jakarta-gump/python/gump/nag.py
  
  Index: nag.py
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/python/gump/nag.py,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- nag.py	18 Oct 2003 22:20:27 -0000	1.18
  +++ nag.py	21 Oct 2003 16:15:52 -0000	1.19
  @@ -76,9 +76,13 @@
   from gump.document import getContextAbsoluteUrl
   
   def nag(workspace,context,moduleFilterList=None,projectFilterList=None):
  +    #
  +    # Nag about the workspace (if it needs it)
  +    #
       if STATUS_FAILED==context.status:
           nagWorkspace(workspace,context)
       
  +    # For all modules...
       for mctxt in context:
           mname=mctxt.name
           if Module.list.has_key(mname):
  @@ -103,8 +107,8 @@
                   
   def nagWorkspace(workspace,context):
       """ Nag for the workspace """
  -    content=getContent(workspace, context, "Workspace ... \n")
  -    email=EmailMessage(workspace.prefix+': Gump Workspace Problem ',content)
  +    content=getContent(workspace, context, "There is a workspace problem... \n")
  +    email=EmailMessage([workspace.mailinglist],workspace.email,workspace.prefix+': Gump Workspace Problem ',content)
       mail([ workspace.mailinglist ],workspace.email,email,workspace.mailserver)
     
   def nagProject(workspace,context,module,mctxt,project,pctxt):
  @@ -114,29 +118,24 @@
       #
       # Form the content...
       #
  -    content+="----------------------------------------------------\n"
       content+=getContent(workspace,mctxt,"Module: " + module.name + "\n")
  -    content+="\n\n\n"
  -    content+="----------------------------------------------------\n"
       content+=getContent(workspace,pctxt,"Project: " + project.name + "\n"    )
  -    content+="\n\n\n"
           
  +    #
  +    # Form the sujhect
  +    #
  +    subject=workspace.prefix+': '+module.name+'/'+project.name+' '+lower(stateName(pctxt.status))
  +    
       nags=0
       for nagEntry in project.nag:
           try:
               #
               # Form and send the e-mail...
               #
  -            email=EmailMessage(workspace.prefix+': '+module.name+'/'+project.name+' '+stateName(pctxt.status),content)
               toaddr=getattr(nagEntry,'to',workspace.mailinglist)
  -            #fromaddr=getattr(nagEntry,'from',workspace.mailinglist)
  -            fromaddr=workspace.email
  -        
  -            # We send to a list, but a list of one is fine..
  -            toaddrs=[ workspace.mailinglist ] # :TODO: toaddr -> to users...
  -        
  -            # Fire ...
  -            mail(toaddrs,fromaddr,email,workspace.mailserver) 
  +            fromaddr=getattr(nagEntry,'from',workspace.mailinglist)
  +            
  +            sendEmail(workspace,workspace.mailinglist,workspace.mailinglist,subject,content)
               
               nags+=1
           except Exception, details:
  @@ -146,16 +145,24 @@
               
       # Belt and braces (nag to us if not nag to them)
       if not nags:
  -        email=EmailMessage(workspace.prefix+': '+module.name+'/'+project.name+' '+stateName(pctxt.status),content)
  -        toaddr=workspace.mailinglist
  -        fromaddr=workspace.email
  -        
  -        # We send to a list, but a list of one is fine..
  -        toaddrs=[ workspace.mailinglist ] # :TODO: toaddr -> to users...
  -        
  -        # Fire ...
  -        mail(toaddrs,fromaddr,email,workspace.mailserver) 
  -    
  +        sendEmail(workspace,workspace.mailinglist,workspace.mailinglist,subject,content)
  +            
  +def sendEmail(workspace, toaddr, fromaddr, subject, content):
  +    #
  +    # We send to a list, but a list of one is fine..
  +    #
  +    toaddrs=[ toaddr ]
  +            
  +    #
  +    # Form the user visable part ...
  +    #
  +    email=EmailMessage( toaddrs, \
  +                        fromaddr, \
  +                        subject, \
  +                        content)                            
  +    # Fire ...
  +    mail(toaddrs,fromaddr,email,workspace.mailserver) 
  +            
   def getContent(workspace,context,message=''):
       content=''
       
  @@ -192,7 +199,6 @@
           content+="\n\nWork Items:\n"
           for workitem in context.worklist:
               content+=workitem.overview()+"\n"            
  -  
       
       return content
       
  
  
  
  1.5       +70 -18    jakarta-gump/python/gump/mailer.py
  
  Index: mailer.py
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/python/gump/mailer.py,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- mailer.py	20 Oct 2003 13:51:41 -0000	1.4
  +++ mailer.py	21 Oct 2003 16:15:52 -0000	1.5
  @@ -69,28 +69,70 @@
   import smtplib, string
           
   class EmailMessage:
  -	def __init__(self,subject,text):
  -		self.subject=subject
  -		self.text=text
           
  -def mail(toaddrs,fromaddr,message,server='localhost'):
  -    """E-mail"""
  -    # Add the From: and To: headers at the start!
  -    data = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n%s%s"
  -       	% (	fromaddr, 
  -       		string.join(toaddrs, ", "),
  -       		message.subject,
  -       		message.text,
  -       		default.signature))
  +	# A *list* if recipients
  +	# A single sender
  +	# The subject
  +    # The text of the message (the main bodypart)
  +    def __init__(self,toaddrs,fromaddr,subject,text,signature=None):
  +        self.toaddrs=toaddrs
  +        self.fromaddr=fromaddr
  +        self.subject=subject
  +        self.text=text
  +		
  +		# The signature
  +        self.signature=signature
  +		
  +		# Defaults
  +        if not self.signature:
  +            self.signature=default.signature
  +
  +    #
  +    # Serialize for sending
  +    #
  +    def getSerialized(self):
  +        """E-mail"""
  +        # Add the From: and To: headers at the start!
  +        data = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n%s%s"
  +           	% (	self.fromaddr, 
  +           		string.join(self.toaddrs, ", "),
  +                self.subject,
  +           		self.text,
  +           		default.signature))
  +           		
  +        return data;
  +     
  +#
  +#	Send an e-mail to a list of addresses, from an address, with content.
  +#	Use the specified server/port.
  +#   
  +def mail(toaddrs,fromaddr,message,server='localhost',port=25):
  +    #
  +    # Sanitize e-mail addresses
  +    #
  +    sane_toaddrs=[]
  +    for toaddr in toaddrs:
  +        sane_toaddrs.append(sanitizeAddress(toaddr))
  +        
  +    sane_fromaddr = sanitizeAddress(fromaddr)
  +    
  +    #
  +    # Get servialized data for e-mail bodyparts...
  +    #
  +    if isinstance(message,EmailMessage):
  +        data = message.getSerialized()
  +    else:
  +        data = EmailMessage(toaddrs,fromaddr,'',str(message)).getSerialized()
       
       try:
           #
           # Attach to the SMTP server to send....
           #
  -        server = smtplib.SMTP(server)
  +        server = smtplib.SMTP(server,port)
           server.set_debuglevel(1)
  -        server.sendmail(fromaddr, toaddrs, data)
  +        server.sendmail(sane_fromaddr, sane_toaddrs, data)
           server.quit()
  +        
       except Exception, details:
           log.error("Failed to send e-mail: " + str(details))
           log.error("Server :" + str(server))
  @@ -99,6 +141,14 @@
           log.error("------------------------------------------------------")
           log.error(data)
       
  +def sanitizeAddress(addr):
  +    parts=addr.split('<')
  +    if len(parts) > 1:
  +        addr=parts[1]
  +    parts=addr.split('>')
  +    addr=parts[0]
  +    return addr
  +    
   if __name__=='__main__':
   
     # init logging
  @@ -107,10 +157,12 @@
     #set verbosity to show all messages of severity >= default.logLevel
     log.setLevel(default.logLevel)
      
  -  email=EmailMessage('There','Hi')
  +  # email=EmailMessage('There','Hi')
  +  
  +  # mail([default.email],default.email,email,default.mailserver)
  +  
  +  # mail([ 'ajack@trysybase.com' ],default.email,email,default.mailserver)
     
  -  mail([default.email],default.email,email,default.mailserver)
  +  print sanitizeAddress('Adam Jack <aj...@trysybase.com>')
     
  -  mail([ 'ajack@trysybase.com' ],default.email,email,default.mailserver)
     
  -  
  \ No newline at end of file
  
  
  
  1.31      +4 -3      jakarta-gump/python/gump/conf.py
  
  Index: conf.py
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/python/gump/conf.py,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- conf.py	20 Oct 2003 23:58:37 -0000	1.30
  +++ conf.py	21 Oct 2003 16:15:52 -0000	1.31
  @@ -103,6 +103,7 @@
       email = 'gump@' + gumpfullhost
       mailinglist = 'gump@jakarta.apache.org'
       mailserver = 'mail.apache.org'
  +    mailport = 25
       prefix = '[GUMPY@' + gumphost + ']'
       signature="\r\n--\r\nGump http://jakarta.apache.org/gump\n" \
           + '[' + gumpfullhost + "]\n"