-
Notifications
You must be signed in to change notification settings - Fork 0
/
smtp.py
134 lines (123 loc) · 4.92 KB
/
smtp.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/python
import datetime
import time
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
import utils
import logger
import db
import config
log = logger.get_logger(__name__)
conf = config.get_config()
import generate_widget
# variables
run_generate_widget = True
# attach the image to the given message
def attach_image(msg,image):
with open(image['filename'], 'r') as file:
img = MIMEImage(file.read(),_subtype="png")
file.close()
img.add_header('Content-ID', '<{}>'.format(image['id']))
msg.attach(img)
# detect if the text contains non-ascii characters
def is_unicode(text):
return not all(ord(c) < 128 for c in text)
# send an email
def send(subject,body,images=[]):
msg = MIMEMultipart()
# attach images
if len(images) > 0:
for image in images: attach_image(msg,image)
# prepare the message
msg['From'] = conf["output"]["email"]["from"]
msg['To'] = ", ".join(conf["output"]["email"]["to"])
msg['Subject'] = "["+conf["general"]["house_name"]+"] "+subject
if is_unicode(body): msg.attach(MIMEText(body.encode('utf-8'),'html','utf-8'))
else: msg.attach(MIMEText(body, 'html'))
smtp = smtplib.SMTP(conf["output"]["email"]["hostname"],conf["output"]["email"]["port"])
# set debug
smtp.set_debuglevel(conf["output"]["email"]["debug"])
# setup TLS
if conf["output"]["email"]["tls"]: smtp.starttls()
# authenticate
if conf["output"]["email"]["username"] != '': smtp.login(conf["output"]["email"]["username"],conf["output"]["email"]["password"])
# send the message
log.info("sending email '"+subject+"' to "+msg['To'])
smtp.sendmail(conf["output"]["email"]["from"],conf["output"]["email"]["to"], msg.as_string())
smtp.quit()
# return the HTML template of the widget
def get_email_widget(title,body):
template = '<tr class="total" style="font-family: \'Helvetica Neue\',Helvetica,Arial,sans-serif; \
box-sizing: border-box; font-size: 14px; margin: 0;"><td class="alignright" width="80%" style="font-family: \'Helvetica \
Neue\',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: center; border-top-width: 2px; \
border-top-color: #333; border-top-style: solid; border-bottom-color: #333; border-bottom-width: 2px; border-bottom-style: solid; font-weight: 700; \
margin: 0; padding: 5px 0;" valign="top">#title# \
<br>#body# \
</td></tr>'
template = template.replace("#body#",body)
template = template.replace("#title#",title)
return template
# return the email HTML template
def get_email_body(title):
with open(conf['constants']['email_template'], 'r') as file:
template = file.read()
template = template.replace("#url#",conf['gui']['url'])
template = template.replace("#version#",conf['constants']['version'])
template = template.replace("#title#",title)
return template
# email module digest
def module_digest(module_id):
log.info("generating module summary email report for module "+module_id)
images = []
widgets = []
module = utils.get_module(module_id)
if module is None: return
if run_generate_widget: widgets = generate_widget.run(module_id,generate_widget=run_generate_widget)
date = datetime.datetime.strftime(datetime.datetime.now()-datetime.timedelta(1),'(%B %e, %Y)')
title = utils.lang(module['display_name'])+" "+date
template = get_email_body(title)
if 'widgets' not in module: return
# for each widget
for widget_id in widgets:
template = template.replace("<!-- widgets -->",get_email_widget('','<img src="cid:'+widget_id+'"/>')+"\n<!-- widgets -->")
# add the image to the queue
images.append({'filename': utils.get_widget_file(widget_id),'id': widget_id,})
# send the email
send(title,template,images)
# email alert digest
def alerts_digest():
log.info("generating alerts summary email report")
alerts = ['alert','warning','info']
date = datetime.datetime.strftime(datetime.datetime.now()-datetime.timedelta(1),'(%B %e, %Y)')
title = "Alerts Summary "+date
template = get_email_body(title)
for severity in alerts:
# for each severity, get the data
text = ""
data = db.rangebyscore(conf["constants"]["db_schema"]["alerts"]+":"+severity,utils.recent(),utils.now(),withscores=True,format_date=True)
if len(data) == 0: continue
# merge the alerts together
for alert in data:
text = "<small>["+alert[0]+"] "+alert[1]+"</small><br>"+text
template = template.replace("<!-- widgets -->",get_email_widget(severity.capitalize(),text)+"\n<!-- widgets -->")
# send the email
send(title,template.encode('utf-8'),[])
# email realtime alert
def notify(text):
log.info("emailing alert "+text)
title = conf["output"]["email"]["subject"]
template = get_email_body(title)
template = template.replace("<!-- widgets -->",get_email_widget("Alert",text))
# send the email
send(title,template.encode('utf-8'),[])
# main
if __name__ == '__main__':
if len(sys.argv) == 1:
print "Usage: "+__file__+" <message>"
else:
notify(sys.argv[1])