alerta-contrib/pubsub/mailer/sendmail.py
2014-08-11 20:44:54 +01:00

120 lines
4.1 KiB
Python

import os
import sys
import smtplib
import socket
import urllib2
import datetime
import re
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from alerta.common import log as logging
from alerta.common import config
LOG = logging.getLogger(__name__)
CONF = config.CONF
class Mailer(object):
mailer_opt = {
'smtp_host': 'localhost',
'smtp_port': 25,
'mail_user': 'alerta@guardian.co.uk',
'mail_list': 'websys@guardian.co.uk',
'dashboard_url': ''
}
def __init__(self, alert):
config.register_opts(Mailer.mailer_opt)
self.subject = '[%s] %s: %s %s on %s %s' % (alert.status, alert.environment, alert.severity, alert.event,
','.join(alert.service), alert.resource)
self.text = "-" * 60 + "\n"
self.text += "[%s] %s: %s %s on %s %s\n" % (alert.status, alert.environment, alert.severity, alert.event,
','.join(alert.service), alert.resource)
self.text += "-" * 60 + "\n\n"
self.text += "Alert Details\n\n"
self.text += "Alert ID: %s\n" % alert.get_id()
self.text += "Create Time: %s\n" % alert.get_date('create_time', 'rfc')
self.text += "Environment: %s\n" % alert.environment
self.text += "Services: %s\n" % ", ".join(alert.service)
self.text += "Resource: %s\n" % alert.resource
self.text += "Event: %s\n" % alert.event
self.text += "Group: %s\n" % alert.group
self.text += "Value: %s\n" % alert.value
self.text += "Severity: %s -> %s\n" % (alert.previous_severity, alert.severity)
self.text += "Status: %s\n" % alert.status
self.text += "Text: %s\n" % alert.text
self.text += "Duplicate Count: %s\n" % alert.duplicate_count
self.text += "Origin: %s\n" % alert.origin
self.text += "Tags: %s\n" % ", ".join(alert.tags)
for k, v in alert.attributes.items():
self.text += "%s: %s\n" % (re.sub('([a-z0-9])([A-Z])', r'\1 \2', k).title(), v)
self.text += "\n"
if 'graphUrl' in alert.attributes:
self.text += "Graph\n\n"
self.text += '%s\n\n' % alert.attributes['graphUrl']
self.graph_url = alert.attributes['graphUrl']
else:
self.graph_url = None
if alert.raw_data:
self.text += "Raw Data\n\n"
self.text += "%s\n\n" % alert.raw_data
self.text += "JSON Format\n\n"
self.text += "%s\n\n" % alert.get_body()
self.text += "To acknowledge this alert visit this URL:\n"
self.text += "%s%s\n\n" % (CONF.dashboard_url, alert.get_id())
self.text += "Generated by %s on %s at %s\n" % (
os.path.basename(sys.argv[0]), os.uname()[1], datetime.datetime.now().strftime("%a %d %b %H:%M:%S"))
LOG.debug('Email Text: %s', self.text)
def send(self, mail_to=None):
LOG.debug('mail_to = %s', mail_to)
msg = MIMEMultipart('related')
msg['Subject'] = self.subject
msg['From'] = CONF.mail_user
msg['To'] = ", ".join(mail_to)
msg.preamble = self.subject
msg_text = MIMEText(self.text, 'plain', 'utf-8')
msg.attach(msg_text)
if self.graph_url:
try:
img = MIMEImage(urllib2.urlopen(self.graph_url).read())
msg.attach(img)
except Exception, e:
LOG.warning('Could not attach graph to email: %s', e)
try:
mx = smtplib.SMTP(CONF.smtp_host)
except (socket.error, socket.herror, socket.gaierror), e:
LOG.error('Mail server connection error: %s', e)
return
try:
if CONF.debug:
mx.set_debuglevel(True)
mx.sendmail(CONF.mail_user, mail_to, msg.as_string())
mx.quit()
except AttributeError, e:
LOG.error('Problem with mail attributes: %s', e)
except smtplib.SMTPException, e:
LOG.error('Failed to send mail to %s on %s:%s : %s', ", ".join(mail_to), CONF.mail_host, CONF.mail_port, e)