Mercurial > hg > gcmultimerge
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: |