-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsend_email.py
116 lines (75 loc) · 3.39 KB
/
send_email.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
# coding=utf-8
from __future__ import print_function
import argparse
import json
import logging
import os
import smtplib
import tempfile
import time
from email.mime.text import MIMEText
from slugify import slugify
import helpers
logger = logging.getLogger('send_email')
handler = logging.FileHandler('send_email.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(funcName)s: %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
logger.info('----- START -----')
def minutes_from_last_email(title):
file_name_with_path = os.path.join(tempfile.gettempdir(), slugify(title))
try:
seconds = float(open(file_name_with_path).read().strip())
except (IOError, ValueError):
return 999999
return (time.time() - seconds) / 60.0
def mark_last_email(title):
file_name_with_path = os.path.join(tempfile.gettempdir(), slugify(title))
with open(file_name_with_path, 'w') as f:
f.write(str(time.time()))
def process_data(addresses, title, if_what, if_gt, if_lt, throttle, data_in):
if minutes_from_last_email(title) < throttle:
return
message = ''
timestamp = helpers.utc_string_datetime_to_local_string_datetime(data_in['ts'])
if if_gt is not None and float(data_in[if_what]) > if_gt:
message = '%s\n\n%s %s: %s > %s\n' % (timestamp, title, if_what, data_in[if_what], if_gt)
if if_lt is not None and float(data_in[if_what]) < if_lt:
message = '%s\n\n%s %s: %s < %s\n' % (timestamp, title, if_what, data_in[if_what], if_lt)
if if_what and if_gt is None and if_lt is None:
# Always send message
message = '%s\n\n%s %s: %s\n' % (timestamp, title, if_what, data_in[if_what])
if message:
email(addresses, 'Alert of %s' % title, message)
mark_last_email(title)
def send_email(address, mime_text):
s = smtplib.SMTP('localhost')
s.sendmail(address, [address], mime_text.as_string())
s.quit()
def email(addresses, subject, message):
for address in addresses:
mime_text = MIMEText(message.encode('utf-8'), 'plain', 'utf-8')
mime_text['Subject'] = subject
mime_text['From'] = address
mime_text['To'] = address
send_email(address, mime_text)
@helpers.exception(logger=logger)
def main():
parser = argparse.ArgumentParser(
description='Read temperature and humidity from stdin and write them to sqlite file.')
parser.add_argument('--title', type=str, required=True, help='Title of the email.')
parser.add_argument('--address', type=str, required=True, action='append',
help='Email address to send alerts. --address can be given multiple times.')
parser.add_argument('--if-what', type=str, required=True, help='Parameter name.')
parser.add_argument('--if-gt', type=float, help='Send email if parameter name is greater than a number.')
parser.add_argument('--if-lt', type=float, help='Send email if parameter name is lower than a number.')
parser.add_argument('--throttle', type=int, help='Send at most one email per THROTTLE minutes.')
args = parser.parse_args()
data_in = helpers.read_stdin()
process_data(args.address, args.title, args.if_what, args.if_gt, args.if_lt, args.throttle, data_in)
data_out = json.dumps(data_in)
print(data_out.encode('utf-8'))
logger.info('----- END -----')
if __name__ == '__main__':
main()