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
0013 _logger = PandaLogger().getLogger("MailUtils")
0014
0015
0016
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
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
0047 def __init__(self):
0048 pass
0049
0050
0051 def send(self, toAddr, mailSubject, mailBody):
0052 _logger.debug("start SEND session")
0053 try:
0054
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
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
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
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
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