comparison multimerge.py @ 113:f45115bfb17a

Implement sendmail mail sending support. Various e-mail related settings have also changed, so this is not backwards compatible. Sorry.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 18 Oct 2016 13:26:20 +0300
parents 8b773358ad47
children 591cc558bbcd
comparison
equal deleted inserted replaced
112:c0c177950dac 113:f45115bfb17a
15 import signal 15 import signal
16 import re 16 import re
17 import codecs 17 import codecs
18 import math 18 import math
19 import time 19 import time
20 #import datetime 20 from subprocess import Popen, PIPE
21 21
22 import smtplib 22 import smtplib
23 from email.mime.text import MIMEText 23 from email.mime.text import MIMEText
24 24
25 import httplib2 25 import httplib2
59 59
60 60
61 ## Fatal errors 61 ## Fatal errors
62 def gcm_fatal(smsg): 62 def gcm_fatal(smsg):
63 gcm_print(u"ERROR: "+ smsg) 63 gcm_print(u"ERROR: "+ smsg)
64 if cfg.email_ok and cfg.email: 64 if cfg.email_ok and cfg.email != "off":
65 ## If e-mail is set, send e-mail 65 ## If e-mail is set, send e-mail
66 msg = MIMEText(("\n".join(gcm_msgbuf)).encode("UTF-8"), "plain") 66 msg = MIMEText(("\n".join(gcm_msgbuf)).encode("UTF-8"), "plain")
67 msg.set_charset("UTF-8") 67 msg.set_charset("UTF-8")
68 msg["Subject"] = cfg.email_subject 68 msg["Subject"] = cfg.email_subject
69 msg["From"] = cfg.email_sender 69 msg["From"] = cfg.email_sender
70 msg["To"] = ",".join(cfg.email_to) 70 msg["To"] = ",".join(cfg.email_to)
71 gcm_print("Sending mail to {0} from {1}, subj: {2} ..".format(";".join(cfg.email_to), cfg.email_sender, cfg.email_subject))
71 try: 72 try:
72 server = smtplib.SMTP(cfg.email_server) 73 if cfg.email == "smtp":
73 if gcm_check_debug(4): 74 gcm_print("Using SMTP server {0}, login {1}".format(cfg.email_smtp_server, cfg.email_smtp_user))
74 server.set_debuglevel(10) 75 server = smtplib.SMTP(cfg.email_smtp_server)
75 76 if gcm_check_debug(4):
76 if cfg.email_use_tls: 77 server.set_debuglevel(10)
77 server.starttls() 78
78 79 if cfg.email_smtp_tls:
79 server.login(cfg.email_srv_user, cfg.email_srv_password) 80 server.starttls()
80 server.sendmail(cfg.email_sender, cfg.email_to, msg.as_string()) 81
81 server.quit() 82 server.login(cfg.email_smtp_user, cfg.email_smtp_password)
83 server.sendmail(cfg.email_sender, cfg.email_to, msg.as_string())
84 server.quit()
85 elif cfg.email == "sendmail":
86 gcm_print("Using sendmail {0}".format(cfg.email_sendmail))
87 p = Popen([cfg.email_sendmail, "-t", "-oi"], stdin=PIPE)
88 p.communicate(msg.as_string())
82 except Exception as e: 89 except Exception as e:
83 gcm_print(u"FATAL: Oh crap, e-mail sending failed: {0}".format(str(e))) 90 gcm_print(u"FATAL: Oh noes, e-mail sending failed: {0}".format(str(e)))
84 sys.exit(1) 91 sys.exit(1)
85 92
86 93
87 ## Debug messages 94 ## Debug messages
88 def gcm_check_debug(level): 95 def gcm_check_debug(level):
314 return mvalue.upper() in gcm_log_levels 321 return mvalue.upper() in gcm_log_levels
315 322
316 def trans_log_level(self, mvalue): 323 def trans_log_level(self, mvalue):
317 return mvalue.upper() 324 return mvalue.upper()
318 325
326 def is_email_state(self, mvalue):
327 if not self.is_str(mvalue):
328 return False
329 else:
330 return mvalue.lower() in [u"off", u"sendmail", u"smtp"]
331
332 def trans_email_state(self, mvalue):
333 return mvalue.lower()
334
319 def is_filename(self, mvalue): 335 def is_filename(self, mvalue):
320 if not self.is_str(mvalue): 336 if not self.is_str(mvalue):
321 return False 337 return False
322 else: 338 else:
323 return re.match("^[a-z0-9][a-z0-9\.\_\-]+$", mvalue, flags=re.IGNORECASE) 339 return re.match("^[a-z0-9][a-z0-9\.\_\-]+$", mvalue, flags=re.IGNORECASE)
386 cfg = GCMSettings() 402 cfg = GCMSettings()
387 403
388 cfg.mdef("debug", True, cfg.is_bool, cfg.trans_bool, False) 404 cfg.mdef("debug", True, cfg.is_bool, cfg.trans_bool, False)
389 405
390 cfg.mdef("email_ok", False, None, None, False) 406 cfg.mdef("email_ok", False, None, None, False)
391 cfg.mdef("email", True, cfg.is_bool, cfg.trans_bool, False) 407 cfg.mdef("email", True, cfg.is_email_state, cfg.trans_email_state, u"off")
408
392 cfg.mdef("email_to", True, cfg.is_email_list, cfg.trans_email_list, None) 409 cfg.mdef("email_to", True, cfg.is_email_list, cfg.trans_email_list, None)
393 cfg.mdef("email_sender", True, cfg.is_email, None, None) 410 cfg.mdef("email_sender", True, cfg.is_email, None, None)
394 cfg.mdef("email_subject", True, cfg.is_string, None, u"Google Calendar MultiMerge status") 411 cfg.mdef("email_subject", True, cfg.is_string, None, u"Google Calendar MultiMerge status")
395 412
396 cfg.mdef("email_use_tls", True, cfg.is_bool, cfg.trans_bool, False) 413 cfg.mdef("email_sendmail", True, cfg.is_string, None, "/usr/sbin/sendmail")
397 cfg.mdef("email_server", True, cfg.is_string, None, None) 414 cfg.mdef("email_smtp_tls", True, cfg.is_bool, cfg.trans_bool, False)
398 cfg.mdef("email_srv_user", True, cfg.is_string, None, None) 415 cfg.mdef("email_smtp_server", True, cfg.is_string, None, None)
399 cfg.mdef("email_srv_password", True, cfg.is_string, None, None) 416 cfg.mdef("email_smtp_user", True, cfg.is_string, None, None)
417 cfg.mdef("email_smtp_password", True, cfg.is_string, None, None)
400 418
401 cfg.mdef("src_regex", True, cfg.is_string, None, u"^R:\s*(.*?)\s*\(\s*(.+?)\s*\)\s*$") 419 cfg.mdef("src_regex", True, cfg.is_string, None, u"^R:\s*(.*?)\s*\(\s*(.+?)\s*\)\s*$")
402 cfg.mdef("src_regmap", False, cfg.is_list, cfg.trans_list, [1, 2]) 420 cfg.mdef("src_regmap", False, cfg.is_list, cfg.trans_list, [1, 2])
403 cfg.mdef("src_regmap_len", False, None, None, len(cfg.src_regmap)) 421 cfg.mdef("src_regmap_len", False, None, None, len(cfg.src_regmap))
404 422
445 # Parse the settings and validate 463 # Parse the settings and validate
446 cfg.mread(cfgparser, section) 464 cfg.mread(cfgparser, section)
447 465
448 466
449 ## Validate settings 467 ## Validate settings
450 if cfg.email: 468 if cfg.email != "off":
451 if cfg.email_subject == None or len(cfg.email_subject) == 0: 469 if cfg.email_subject == None or len(cfg.email_subject) == 0:
452 gcm_fatal(u"E-mail enabled but email_subject not set.") 470 gcm_fatal(u"E-mail enabled but email_subject not set.")
453 elif cfg.email_sender == None: 471 elif cfg.email_sender == None:
454 gcm_fatal(u"E-mail enabled but email_sender not set.") 472 gcm_fatal(u"E-mail enabled but email_sender not set.")
455 elif cfg.email_to == None: 473 elif cfg.email_to == None: