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...