mailServer.py

Go to the documentation of this file.
00001 import sys
00002 import cStringIO as StringIO
00003 import smtplib
00004 import sets
00005 import traceback
00006 
00007 from vyperlogix.classes.CooperativeClass import Cooperative
00008 from vyperlogix.misc import _utils
00009 from vyperlogix import misc
00010 
00011 from vyperlogix.daemon.daemon import Log
00012 
00013 from vyperlogix.misc import LazyImport
00014 from vyperlogix.misc import ObjectTypeName
00015 
00016 __copyright__ = """\
00017 (c). Copyright 1990-2008, Vyper Logix Corp., All Rights Reserved.
00018 
00019 Published under Creative Commons License 
00020 (http://creativecommons.org/licenses/by-nc/3.0/) 
00021 restricted to non-commercial educational use only., 
00022 
00023 See also: http://www.VyperLogix.com and http://www.pypi.info for details.
00024 
00025 THE AUTHOR VYPER LOGIX CORP DISCLAIMS ALL WARRANTIES WITH REGARD TO
00026 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
00027 FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
00028 INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
00029 FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
00030 NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
00031 WITH THE USE OR PERFORMANCE OF THIS SOFTWARE !
00032 
00033 USE AT YOUR OWN RISK.
00034 """
00035 
00036 ##
00037 # 
00038 #     This class contains the methods necessary for:
00039 # 
00040 #     
00041 class MailServer(Cooperative):
00042     debug = 0
00043     def __init__(self, logger=None):
00044         self.__smtp_server__ = ''
00045         self.__smtp_port__ = -1
00046         self.__smtp_username__ = ''
00047         self.__smtp_password__ = ''
00048         self.__logger__ = None
00049         
00050         print 'You cannot use the %s class because this is an Abstract Class.  Try using one of the sub-classes instead.' % (ObjectTypeName.typeName(self))
00051         
00052     def __repr__(self):
00053         return '(%s) %s:%s @ %s' % (str(self.__class__),self.smtp_server,self.smtp_port,self.smtp_username)
00054 
00055     def logger():
00056         doc = "logger"
00057         def fget(self):
00058             return self.__logger__
00059         def fset(self, logger):
00060             self.__logger__ = logger
00061         return locals()
00062     logger = property(**logger())
00063 
00064     def smtp_server():
00065         doc = "smtp_server"
00066         def fget(self):
00067             return self.__smtp_server__
00068         def fset(self, value):
00069             self.__smtp_server__ = value
00070         return locals()
00071     smtp_server = property(**smtp_server())
00072 
00073     def smtp_port():
00074         doc = "smtp_port"
00075         def fget(self):
00076             return self.__smtp_port__
00077         def fset(self, value):
00078             self.__smtp_port__ = value if (isinstance(value,int)) else int(str(value))
00079         return locals()
00080     smtp_port = property(**smtp_port())
00081 
00082     def smtp_username():
00083         doc = "smtp_username"
00084         def fget(self):
00085             return self.__smtp_username__
00086         def fset(self, value):
00087             self.__smtp_username__ = value
00088         return locals()
00089     smtp_username = property(**smtp_username())
00090 
00091     def smtp_password():
00092         doc = "smtp_password"
00093         def fget(self):
00094             return self.__smtp_password__
00095         def fset(self, value):
00096             self.__smtp_password__ = value
00097         return locals()
00098     smtp_password = property(**smtp_password())
00099 
00100     def login(self):
00101         if (self.smtp_port < 1):
00102             toks = self.smtp_server.split(':')
00103             self.smtp_server = toks[0]
00104             self.smtp_port = -1 if (len(toks) != 2) else -1 if (not toks[-1].isdigit()) else int(toks[-1])
00105         if (len(self.smtp_server) > 0) and (isinstance(self.smtp_port,int)) and (self.smtp_port > -1):
00106             print '(%s.%s) :: smtpServer=[%s], port=[%s], username=[%s], password=[%s]' % (ObjectTypeName.typeName(self),misc.funcName(),self.smtp_server,self.smtp_port,self.smtp_username,self.smtp_password)
00107             try:
00108                 self.mailServer = smtplib.SMTP(host=self.smtp_server,port=self.smtp_port)
00109                 self.mailServer.set_debuglevel(self.debug)
00110                 if (len(self.smtp_username) > 0) and (len(self.smtp_password) > 0):
00111                     self.mailServer.login(self.smtp_username,self.smtp_password)
00112             except Exception, details:
00113                 tbinfofile = StringIO.StringIO()
00114                 traceback.print_exc(None, tbinfofile)
00115                 tbinfofile.seek(0)
00116                 tbinfo = tbinfofile.read()
00117                 _msg = '(%s.%s) :: ERROR due to "%s"\n%s.' % (ObjectTypeName.typeName(self),misc.funcName(),details,tbinfo)
00118                 print >>sys.stderr, _msg
00119                 raise smtplib.SMTPConnectError(_msg)
00120             self.log = self.logger
00121         else:
00122             _msg = '(%s.%s) :: WARNING :: Invalid SMTP Configuration that does not work, recommend checking your choices and attributes because something is wrong. smtpServer=[%s], port=[%s], username=[%s], password=[%s]' % (ObjectTypeName.typeName(self),misc.funcName(),self.smtp_server,self.smtp_port,self.smtp_username,self.smtp_password)
00123             print >>sys.stderr, _msg
00124             raise ValueError(_msg)
00125 
00126     ##
00127     # 
00128     #         Generates a text version of an e-mail using 'fromAddress',
00129     #         'toArray' (an array of e-mail addresses), 'subject', and
00130     #         'buf' (a buffer holding the e-mail text).
00131     #         
00132     def genEmailTxt(self, fromAddress, toArray, subject, buf, ccArray=None, bccArray=None):
00133         buf.seek(0)
00134         
00135         msgTxt = self.setEmailTxt(fromAddress, toArray, subject, buf.read(), ccArray, bccArray)
00136         
00137         return msgTxt
00138 
00139     ##
00140     # 
00141     #         Generates a text version of an e-mail using 'fromAddress',
00142     #         'toArray' (an array of e-mail addresses), 'subject', and
00143     #         
00144     def setEmailTxt(self, fromAddress, toArray, subject, msgStr, ccArray=None, bccArray=None):
00145         hdrBuf = StringIO.StringIO()
00146         hdrBuf.write('From: %s\r\n' % fromAddress)
00147 
00148         hdrBuf.write('To: %s\r\n' %','.join(toArray))
00149 
00150         if ccArray is not None:
00151             hdrBuf.write('CC: %s\r\n' %','.join(ccArray))
00152         
00153         if bccArray is not None:
00154             hdrBuf.write('BCC: %s\r\n' %','.join(bccArray))
00155 
00156         hdrBuf.write('Subject: %s\r\n' %subject)
00157 
00158         hdrBuf.write('\r\n') # Separator break btwn hdr and msg
00159             
00160         msgTxt = '%s%s' % (hdrBuf.getvalue(), msgStr.encode('ascii','replace'))
00161 
00162         if self.log is not None:
00163             self.log.log(5,'\n\n%s\n\n', msgTxt)
00164         
00165         return msgTxt
00166 
00167     ##
00168     # 
00169     #         actually send the email message.
00170     # 
00171     #         message - Message object
00172     #         trial - if set to True, doesn't actually send email. Default: False
00173     #         
00174     def sendEmail(self, message, trial=False):
00175         msgTxt = message.message
00176 
00177         if trial is True:
00178             if self.log is not None:
00179                 self.log.debug('TRIAL email FROM:%s \tTO:%s', message.fromAdd, message.toAddList)
00180                 self.log.debug('TRIAL email BODY:%s', msgTxt)
00181             
00182             return {'trial':[message.toAddList, msgTxt]}
00183         
00184         else:
00185             toSet = sets.Set(message.toAddList)
00186             ccSet = sets.Set(message.ccAddList)
00187             bccSet = sets.Set(message.bccAddList)
00188             sendToList = toSet | ccSet | bccSet # union 
00189             
00190             try:                
00191                 mstat = self.mailServer.sendmail(message.fromAdd, sendToList, msgTxt.encode('ascii', 'replace'))
00192                 toAlias = sendToList
00193 
00194                 info_string = "Sent mail with Subject '%s' to %s" % (message.subject[:50],toAlias)
00195                 if self.log is not None:                    
00196                     self.log.info(info_string)
00197                 else:
00198                     print >>sys.stderr, info_string
00199                 
00200                 return mstat
00201             
00202             except smtplib.SMTPRecipientsRefused, details:
00203                 info_string = 'Error mail not sent, problem in Recepients %s\n%s' % (sendToList,_utils.formattedException(details=details))
00204                 if self.log is not None:
00205                     self.log.exception(info_string)
00206                 else:
00207                     print >>sys.stderr, info_string
00208                 
00209                 return info_string
00210 
00211             except Exception, details:
00212                 info_string = 'Error in delivering e-mail to one of %s\n%s' % (sendToList,_utils.formattedException(details=details))
00213                 if self.log is not None:
00214                     self.log.exception(info_string)
00215                     self.log.exception(' %s ERROR:%s', Exception, e)
00216                 else:
00217                     print >>sys.stderr, info_string
00218                 
00219                 return info_string
00220 
00221     ##
00222     # 
00223     #         generic mail sending results printing
00224     #         accepts Message object and results structure
00225     #         
00226     def getSendResults(self, message, emailResults):
00227         subject = message.subject
00228         
00229         toAddrDict = {}
00230         for toAddr in message.toAddList:
00231             if emailResults is None: 
00232                 toAddrDict[toAddr] = False
00233                 
00234             elif hasattr(emailResults, 'recipients'):
00235                 bounces = emailResults.recipients
00236                 
00237                 if bounces.has_key(toAddr):
00238                     toAddrDict[toAddr] = False
00239                     
00240             else:                            
00241                 toAddrDict[toAddr] = True
00242                 
00243         if emailResults == {}:
00244             toAlias = message.toAddList
00245             
00246             msg = 'Sent TO %s AS %s' % (toAlias, subject[:80])
00247                 
00248         else:
00249             for toAddr in toAddrDict.keys():
00250                 if toAddrDict.get(toAddr):
00251                     msg = 'Sent TO %s AS %s' %(toAddr, subject[:80])
00252                         
00253                 else:
00254                     msg = "Email to %s failed %s" %(toAddr, emailResults)
00255                     if self.log is not None:
00256                         self.log.error(msg)
00257                     
00258         return msg
00259 
00260 # The GMailServer MailServer subclass does the job - don't use the others for anything other than testing...
00261 class GMailServer(MailServer):
00262     def __init__(self,username,password,server='smtp.gmail.com',port=587,logger=None):
00263         self.__smtp_server__ = server
00264         self.__smtp_port__ = port
00265 
00266         toks = server.split(':')
00267         if (len(toks) > 1):
00268             self.__smtp_server__ = toks[0]
00269             self.__smtp_port__ = 25 if (len(toks) == 1) else toks[-1] if (not toks[-1].isdigit()) else int(toks[-1])
00270 
00271         self.__smtp_username__ = username
00272         self.__smtp_password__ = password
00273         self.__logger__ = logger
00274 
00275     def _sendEmail(self, _from, _to, _message, isDebug=False):
00276         server = smtplib.SMTP(self.smtp_server, self.smtp_port)
00277         if (isDebug):
00278             server.set_debuglevel(1)
00279         server.ehlo()
00280         server.starttls()
00281         server.ehlo()
00282         if (len(self.smtp_username) > 0) and (len(self.smtp_password) > 0):
00283             server.login(self.smtp_username, self.smtp_password)
00284         server.sendmail(_from, _to, _message)
00285         server.quit()
00286     
00287     def sendEmail(self, email_message, trial=False, isDebug=False):
00288         self._sendEmail(email_message.fromAdd, email_message.toAddList, email_message.message, isDebug=isDebug)
00289 
00290 class SMTPServer(GMailServer):
00291     def _sendEmail(self, _from, _to, _message, isDebug=False):
00292         server = smtplib.SMTP(self.smtp_server, self.smtp_port)
00293         if (isDebug):
00294             server.set_debuglevel(1)
00295         if (len(self.smtp_username) > 0) and (len(self.smtp_password) > 0):
00296             server.login(self.smtp_username, self.smtp_password)
00297         server.sendmail(_from, _to, _message)
00298         server.quit()
00299 
00300 class SvnDynOSaurServer(MailServer):
00301     def __init__(self,logger=None):
00302         self.__smtp_server__ = 'svn.dyn-o-saur.com'
00303         self.__smtp_port__ = 25
00304         self.__smtp_username__ = ''
00305         self.__smtp_password__ = ''
00306         self.__logger__ = logger
00307         self.login()
00308 
00309 class LocalhostServer8025(MailServer):
00310     def __init__(self,logger=None):
00311         self.__smtp_server__ = '127.0.0.1'
00312         self.__smtp_port__ = 8025
00313         self.__smtp_username__ = ''
00314         self.__smtp_password__ = ''
00315         self.__logger__ = logger
00316         self.login()
00317 
00318 class LocalhostServer(MailServer):
00319     def __init__(self,logger=None):
00320         self.__smtp_server__ = '127.0.0.1'
00321         self.__smtp_port__ = 25
00322         self.__smtp_username__ = ''
00323         self.__smtp_password__ = ''
00324         self.__logger__ = logger
00325         self.login()
00326 
00327 class AdhocServer(MailServer):
00328     def __init__(self,smtp_server,username='',password='',logger=None):
00329         toks = smtp_server.split(':')
00330         self.__smtp_server__ = toks[0]
00331         self.__smtp_port__ = 25 if (len(toks) == 1) else toks[-1] if (not toks[-1].isdigit()) else int(toks[-1])
00332         self.__smtp_username__ = username
00333         self.__smtp_password__ = password
00334         self.__logger__ = logger
00335         self.login()
00336         
00337 class GoDaddyServer(Cooperative):
00338     def __init__(self,username,password,server='smtpout.secureserver.net:3535'):
00339         toks = server.split(':')
00340         self.__server__ = toks[0]
00341         self.__port__ = 25 if (len(toks) == 1) else toks[-1] if (not toks[-1].isdigit()) else int(toks[-1])
00342         self.__username__ = username
00343         self.__password__ = password
00344         self.__lastError__ = ''
00345         
00346     def sendEmail(self,to_addr,from_addr,subject,message):
00347         import os, sys
00348         import smtplib
00349         server = smtplib.SMTP(self.__server__)
00350         try:
00351             server.login(self.__username__, self.__password__)
00352         except smtplib.SMTPAuthenticationError, details:
00353             self.__lastError__ = str(details)
00354         
00355         msg = (
00356         "To: %s\r\n"
00357         "From: %s\r\n"
00358         "Subject: %s\r\n"
00359         "Content-type: text/plain\r\n"
00360         "\r\n"
00361         "%s\r\n" % (to_addr,from_addr,subject,message))
00362         
00363         try:
00364             server.sendmail(from_addr, to_addr, msg)
00365             server.quit()
00366         except smtplib.SMTPAuthenticationError, details:
00367             self.__lastError__ = str(details)
00368 
00369 if (__name__ == '__main__'):
00370     import sys
00371     print >>sys.stdout, __copyright__
00372     print >>sys.stderr, __copyright__
00373 
00374     #msg_content = '''
00375 #Click this link http://www.vyperlogix.com.
00376     #'''
00377     #from vyperlogix.mail.message import Message
00378     #msg = Message('support@vyperlogix.com', 'raychorn@hotmail.com', msg_content, subject="This is a test.")
00379     #smtp = GMailServer('investors@vyperlogix.com', 'peekab00', server='smtpout.secureserver.net', port=3535)
00380     #smtp.sendEmail(msg)
00381     
00382     #msg_content = '''
00383 #Click this link http://www.vyperlogix.com.
00384     #'''
00385     #from vyperlogix.mail.message import Message
00386     #msg = Message('support@vyperlogix.com', 'raychorn@hotmail.com', msg_content, subject="This is a test.")
00387     #smtp = AdhocServer('SQL2005:25')
00388     #smtp.sendEmail(msg)
00389 
00390 

© Copyright 2008-2009 Vyper Logix Corp., All Right Reserved; If you reference this document or any part of this document you must use the citation verbatim (including the link) "© Copyright 2008-2009 Vyper Logix Corp., All Right Reserved."

Notice: This source code contained in this document is NOT open source and is NOT being distributed as open source.

122,241 lines of code and growing...