Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-10 08:39:02

0001 """
0002 email utilities
0003 """
0004 
0005 import smtplib
0006 import sys
0007 
0008 from pandacommon.pandalogger.PandaLogger import PandaLogger
0009 
0010 from pandaserver.config import panda_config
0011 
0012 # logger
0013 _logger = PandaLogger().getLogger("MailUtils")
0014 
0015 
0016 # wrapper to patch smtplib.stderr to send debug info to logger
0017 class StderrLogger(object):
0018     def __init__(self, tmpLog):
0019         self.tmpLog = tmpLog
0020 
0021     def write(self, message):
0022         message = message.strip()
0023         if message != "":
0024             self.tmpLog.debug(message)
0025 
0026 
0027 # wrapper of SMTP to redirect messages
0028 class MySMTP(smtplib.SMTP):
0029     def set_log(self, tmp_log):
0030         self.tmpLog = tmp_log
0031         try:
0032             self.org_stderr = getattr(smtplib, "stderr")
0033             setattr(smtplib, "stderr", tmp_log)
0034         except Exception:
0035             self.org_stderr = None
0036 
0037     def _print_debug(self, *args):
0038         self.tmpLog.write(" ".join(map(str, args)))
0039 
0040     def reset_log(self):
0041         if self.org_stderr is not None:
0042             setattr(smtplib, "stderr", self.org_stderr)
0043 
0044 
0045 class MailUtils:
0046     # constructor
0047     def __init__(self):
0048         pass
0049 
0050     # main
0051     def send(self, toAddr, mailSubject, mailBody):
0052         _logger.debug("start SEND session")
0053         try:
0054             # remove duplicated address
0055             listToAddr = []
0056             newToAddr = ""
0057             for tmpToAddr in toAddr.split(","):
0058                 if tmpToAddr not in listToAddr:
0059                     listToAddr.append(tmpToAddr)
0060                     newToAddr += f"{tmpToAddr},"
0061             toAddr = newToAddr[:-1]
0062 
0063             # make message
0064             fromAdd = panda_config.emailSender
0065             message = f"Subject: {mailSubject}\n" f"From: {fromAdd}\n" f"To: {toAddr}\n\n" f"{mailBody}"
0066             message = self.addTailer(message)
0067 
0068             # send mail
0069             _logger.debug(f"send to {toAddr}\n{message}")
0070             stderrLog = StderrLogger(_logger)
0071             server = MySMTP(panda_config.emailSMTPsrv)
0072             server.set_debuglevel(1)
0073             server.set_log(stderrLog)
0074             server.ehlo()
0075             server.starttls()
0076             # server.login(panda_config.emailLogin,panda_config.emailPass)
0077             out = server.sendmail(fromAdd, listToAddr, message)
0078             _logger.debug(out)
0079             server.quit()
0080             retVal = True
0081         except Exception:
0082             type, value, traceBack = sys.exc_info()
0083             _logger.error(f"{type} {value}")
0084             retVal = False
0085         try:
0086             server.reset_log()
0087         except Exception:
0088             pass
0089         _logger.debug("end SEND session")
0090         return retVal
0091 
0092     # add tailer
0093     def addTailer(self, msg):
0094         msg += """
0095 Report Panda problems of any sort to
0096 
0097   the eGroup for help request
0098     hn-atlas-dist-analysis-help@cern.ch
0099     
0100   the Discourse forum for distributed computing help  
0101     https://atlas-talk.web.cern.ch/c/distributed-computing-help
0102     
0103   the Panda JIRA for software bug
0104     https://its.cern.ch/jira/browse/ATLASPANDA
0105 """
0106         return msg