def createEmail(self, msgdict, builderName, projectName, results, build, patch=None, logs=None): text = msgdict['body'].encode(ENCODING) type = msgdict['type'] if 'subject' in msgdict: subject = msgdict['subject'].encode(ENCODING) else: subject = self.subject % { 'result': Results[results], 'projectName': projectName, 'builder': builderName, } assert type in ('plain', 'html'), "'%s' message type must be 'plain' or 'html'." % type if patch or logs: m = MIMEMultipart() m.attach(MIMEText(text, type, ENCODING)) else: m = Message() m.set_payload(text, ENCODING) m.set_type("text/%s" % type) m['Date'] = formatdate(localtime=True) m['Subject'] = subject m['From'] = self.fromaddr # m['To'] is added later if patch: a = MIMEText(patch[1].encode(ENCODING), _charset=ENCODING) a.add_header('Content-Disposition', "attachment", filename="source patch") m.attach(a) if logs: for log in logs: name = "%s.%s" % (log.getStep().getName(), log.getName()) if self._shouldAttachLog(log.getName()) or self._shouldAttachLog(name): a = MIMEText(log.getText().encode(ENCODING), _charset=ENCODING) a.add_header('Content-Disposition', "attachment", filename=name) m.attach(a) # Add any extra headers that were requested, doing WithProperties # interpolation if necessary if self.extraHeaders: properties = build.getProperties() for k,v in self.extraHeaders.items(): k = properties.render(k) if k in m: twlog("Warning: Got header " + k + " in self.extraHeaders " "but it already exists in the Message - " "not adding it.") continue m[k] = properties.render(v) return m
def createEmail(self, msgdict, builderName, projectName, results, patch=None, logs=None): text = msgdict['body'].encode(ENCODING) type = msgdict['type'] if 'subject' in msgdict: subject = msgdict['subject'].encode(ENCODING) else: subject = self.subject % { 'result': Results[results], 'projectName': projectName, 'builder': builderName, } assert type in ('plain', 'html'), "'%s' message type must be 'plain' or 'html'." % type if patch or logs: m = MIMEMultipart() m.attach(MIMEText(text, type, ENCODING)) else: m = Message() m.set_payload(text, ENCODING) m.set_type("text/%s" % type) m['Date'] = formatdate(localtime=True) m['Subject'] = subject m['From'] = self.fromaddr # m['To'] is added later if patch: a = MIMEText(patch[1].encode(ENCODING), _charset=ENCODING) a.add_header('Content-Disposition', "attachment", filename="source patch") m.attach(a) if logs: for log in logs: name = "%s.%s" % (log.getStep().getName(), log.getName()) if self._shouldAttachLog(log.getName()) or self._shouldAttachLog(name): a = MIMEText(log.getText().encode(ENCODING), _charset=ENCODING) a.add_header('Content-Disposition', "attachment", filename=name) m.attach(a) # Add any extra headers that were requested, doing WithProperties # interpolation if necessary if self.extraHeaders: for k,v in self.extraHeaders.items(): k = properties.render(k) if k in m: twlog("Warning: Got header " + k + " in self.extraHeaders " "but it already exists in the Message - " "not adding it.") continue m[k] = properties.render(v) return m
def buildMessage(self, name, build, results): # # logs is a list of tuples that contain the log # name, log url, and the log contents as a list of strings. # logs = list() for logf in build.getLogs(): logStep = logf.getStep() stepName = logStep.getName() logStatus, dummy = logStep.getResults() logName = logf.getName() logs.append(('%s.%s' % (stepName, logName), '%s/steps/%s/logs/%s' % (self.status.getURLForThing(build), stepName, logName), logf.getText().splitlines(), logStatus)) properties = build.getProperties() attrs = {'builderName': name, 'projectName': self.status.getProjectName(), 'mode': self.mode, 'result': Results[results], 'buildURL': self.status.getURLForThing(build), 'buildbotURL': self.status.getBuildbotURL(), 'buildText': build.getText(), 'buildProperties': properties, 'slavename': build.getSlavename(), 'reason': build.getReason(), 'responsibleUsers': build.getResponsibleUsers(), 'branch': "", 'revision': "", 'patch': "", 'changes': [], 'logs': logs} ss = build.getSourceStamp() if ss: attrs['branch'] = ss.branch attrs['revision'] = ss.revision attrs['patch'] = ss.patch attrs['changes'] = ss.changes[:] text, type = self.customMesg(attrs) assert type in ('plain', 'html'), "'%s' message type must be 'plain' or 'html'." % type haveAttachments = False if attrs['patch'] or self.addLogs: haveAttachments = True if not canDoAttachments: twlog.msg("warning: I want to send mail with attachments, " "but this python is too old to have " "email.MIMEMultipart . Please upgrade to python-2.3 " "or newer to enable addLogs=True") if haveAttachments and canDoAttachments: m = MIMEMultipart() m.attach(MIMEText(text, type)) else: m = Message() m.set_payload(text) m.set_type("text/%s" % type) m['Date'] = formatdate(localtime=True) m['Subject'] = self.subject % { 'result': attrs['result'], 'projectName': attrs['projectName'], 'builder': attrs['builderName'], } m['From'] = self.fromaddr # m['To'] is added later if attrs['patch']: a = MIMEText(attrs['patch'][1]) a.add_header('Content-Disposition', "attachment", filename="source patch") m.attach(a) if self.addLogs: for log in build.getLogs(): name = "%s.%s" % (log.getStep().getName(), log.getName()) if self._shouldAttachLog(log.getName()) or self._shouldAttachLog(name): a = MIMEText(log.getText()) a.add_header('Content-Disposition', "attachment", filename=name) m.attach(a) # Add any extra headers that were requested, doing WithProperties # interpolation if necessary if self.extraHeaders: for k,v in self.extraHeaders: k = properties.render(k) if k in m: twlog("Warning: Got header " + k + " in self.extraHeaders " "but it already exists in the Message - " "not adding it.") continue m[k] = properties.render(v) # now, who is this message going to? dl = [] recipients = [] if self.sendToInterestedUsers and self.lookup: for u in build.getInterestedUsers(): d = defer.maybeDeferred(self.lookup.getAddress, u) d.addCallback(recipients.append) dl.append(d) d = defer.DeferredList(dl) d.addCallback(self._gotRecipients, recipients, m) return d
def buildMessage(self, name, build, results): if self.customMesg: # the customMesg stuff can be *huge*, so we prefer not to load it attrs = self.getCustomMesgData(self.mode, name, build, results, self.master_status) text, type = self.customMesg(attrs) msgdict = {"body": text, "type": type} elif self.messageFormatter: msgdict = self.messageFormatter(self.mode, name, build, results, self.master_status) else: msgdict = self.defaultMessage(self.mode, name, build, results, self.master_status) text = msgdict["body"] type = msgdict["type"] if "subject" in msgdict: subject = msgdict["subject"] else: subject = self.subject % { "result": Results[results], "projectName": self.master_status.getProjectName(), "builder": name, } assert type in ("plain", "html"), "'%s' message type must be 'plain' or 'html'." % type haveAttachments = False ss = build.getSourceStamp() if (ss and ss.patch and self.addPatch) or self.addLogs: haveAttachments = True if not canDoAttachments: twlog.msg( "warning: I want to send mail with attachments, " "but this python is too old to have " "email.MIMEMultipart . Please upgrade to python-2.3 " "or newer to enable addLogs=True" ) if haveAttachments and canDoAttachments: m = MIMEMultipart() m.attach(MIMEText(text, type)) else: m = Message() m.set_payload(text) m.set_type("text/%s" % type) m["Date"] = formatdate(localtime=True) m["Subject"] = subject m["From"] = self.fromaddr # m['To'] is added later if ss and ss.patch and self.addPatch: patch = ss.patch a = MIMEText(patch[1]) a.add_header("Content-Disposition", "attachment", filename="source patch") m.attach(a) if self.addLogs: for log in build.getLogs(): name = "%s.%s" % (log.getStep().getName(), log.getName()) if self._shouldAttachLog(log.getName()) or self._shouldAttachLog(name): a = MIMEText(log.getText()) a.add_header("Content-Disposition", "attachment", filename=name) m.attach(a) # Add any extra headers that were requested, doing WithProperties # interpolation if necessary if self.extraHeaders: for k, v in self.extraHeaders.items(): k = properties.render(k) if k in m: twlog( "Warning: Got header " + k + " in self.extraHeaders " "but it already exists in the Message - " "not adding it." ) continue m[k] = properties.render(v) # now, who is this message going to? dl = [] recipients = [] if self.sendToInterestedUsers and self.lookup: for u in build.getInterestedUsers(): d = defer.maybeDeferred(self.lookup.getAddress, u) d.addCallback(recipients.append) dl.append(d) d = defer.DeferredList(dl) d.addCallback(self._gotRecipients, recipients, m) return d
def buildMessage(self, name, build, results): if self.customMesg: # the customMesg stuff can be *huge*, so we prefer not to load it attrs = self.getCustomMesgData(self.mode, name, build, results, self.master_status) text, type = self.customMesg(attrs) msgdict = { 'body' : text, 'type' : type } else: msgdict = self.messageFormatter(self.mode, name, build, results, self.master_status) text = msgdict['body'] type = msgdict['type'] if 'subject' in msgdict: subject = msgdict['subject'] else: subject = self.subject % { 'result': Results[results], 'projectName': self.master_status.getProjectName(), 'builder': name, } assert type in ('plain', 'html'), "'%s' message type must be 'plain' or 'html'." % type ss = build.getSourceStamp() if (ss and ss.patch and self.addPatch) or self.addLogs: m = MIMEMultipart() m.attach(MIMEText(text, type)) else: m = Message() m.set_payload(text) m.set_type("text/%s" % type) m['Date'] = formatdate(localtime=True) m['Subject'] = subject m['From'] = self.fromaddr # m['To'] is added later if ss and ss.patch and self.addPatch: patch = ss.patch a = MIMEText(patch[1]) a.add_header('Content-Disposition', "attachment", filename="source patch") m.attach(a) if self.addLogs: for log in build.getLogs(): name = "%s.%s" % (log.getStep().getName(), log.getName()) if self._shouldAttachLog(log.getName()) or self._shouldAttachLog(name): a = MIMEText(log.getText()) a.add_header('Content-Disposition', "attachment", filename=name) m.attach(a) # Add any extra headers that were requested, doing WithProperties # interpolation if necessary if self.extraHeaders: for k,v in self.extraHeaders.items(): k = properties.render(k) if k in m: twlog("Warning: Got header " + k + " in self.extraHeaders " "but it already exists in the Message - " "not adding it.") continue m[k] = properties.render(v) # now, who is this message going to? dl = [] recipients = [] if self.sendToInterestedUsers and self.lookup: for u in build.getInterestedUsers(): d = defer.maybeDeferred(self.lookup.getAddress, u) d.addCallback(recipients.append) dl.append(d) d = defer.DeferredList(dl) d.addCallback(self._gotRecipients, recipients, m) return d
def buildMessage(self, name, build, results): if self.customMesg: # the customMesg stuff can be *huge*, so we prefer not to load it attrs = self.getCustomMesgData(self.mode, name, build, results, self.master_status) text, type = self.customMesg(attrs) msgdict = { 'body' : text, 'type' : type } elif self.messageFormatter: msgdict = self.messageFormatter(self.mode, name, build, results, self.master_status) else: msgdict = self.defaultMessage(self.mode, name, build, results, self.master_status) text = msgdict['body'] type = msgdict['type'] if 'subject' in msgdict: subject = msgdict['subject'] else: subject = self.subject % { 'result': Results[results], 'projectName': self.master_status.getProjectName(), 'builder': name, } assert type in ('plain', 'html'), "'%s' message type must be 'plain' or 'html'." % type haveAttachments = False ss = build.getSourceStamp() if (ss and ss.patch and self.addPatch) or self.addLogs: haveAttachments = True if not canDoAttachments: twlog.msg("warning: I want to send mail with attachments, " "but this python is too old to have " "email.MIMEMultipart . Please upgrade to python-2.3 " "or newer to enable addLogs=True") if haveAttachments and canDoAttachments: m = MIMEMultipart() m.attach(MIMEText(text, type)) else: m = Message() m.set_payload(text) m.set_type("text/%s" % type) m['Date'] = formatdate(localtime=True) m['Subject'] = subject m['From'] = self.fromaddr # m['To'] is added later if ss and ss.patch and self.addPatch: patch = ss.patch a = MIMEText(patch[1]) a.add_header('Content-Disposition', "attachment", filename="source patch") m.attach(a) if self.addLogs: for log in build.getLogs(): name = "%s.%s" % (log.getStep().getName(), log.getName()) if self._shouldAttachLog(log.getName()) or self._shouldAttachLog(name): a = MIMEText(log.getText()) a.add_header('Content-Disposition', "attachment", filename=name) m.attach(a) # Add any extra headers that were requested, doing WithProperties # interpolation if necessary if self.extraHeaders: for k,v in self.extraHeaders.items(): k = properties.render(k) if k in m: twlog("Warning: Got header " + k + " in self.extraHeaders " "but it already exists in the Message - " "not adding it.") continue m[k] = properties.render(v) # now, who is this message going to? dl = [] recipients = [] if self.sendToInterestedUsers and self.lookup: for u in build.getInterestedUsers(): d = defer.maybeDeferred(self.lookup.getAddress, u) d.addCallback(recipients.append) dl.append(d) d = defer.DeferredList(dl) d.addCallback(self._gotRecipients, recipients, m) return d