changeset 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 c0c177950dac
children 591cc558bbcd
files example.cfg multimerge.py
diffstat 2 files changed, 46 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/example.cfg	Tue Oct 18 12:56:44 2016 +0300
+++ b/example.cfg	Tue Oct 18 13:26:20 2016 +0300
@@ -31,18 +31,24 @@
 ###
 ### E-mail settings
 ###
-# Enable/disable sending of e-mail message in case of fatal errors
+# Enable sending of e-mail message in case of fatal errors
+# off = Don't send e-mail
+# smtp = use an SMTP server for sending (see below settings)
+# sendmail = use local sendmail (see below settings)
 email = off
 
+# Sendmail binary location
+email_sendmail = /usr/bin/sendmail
+
 # SMTP server for sending mail
-#email_server = host[:port]
+#email_smtp_server = host[:port]
 
 # SMTP user and password (not encrypted!)
-#email_srv_user = username
-#email_srv_password = password
+#email_smtp_user = username
+#email_smtp_password = password
 
 # Use TLS
-#email_use_tls = no
+#email_smtp_tls = no
 
 
 # Message subject
--- a/multimerge.py	Tue Oct 18 12:56:44 2016 +0300
+++ b/multimerge.py	Tue Oct 18 13:26:20 2016 +0300
@@ -17,7 +17,7 @@
 import codecs
 import math
 import time
-#import datetime
+from subprocess import Popen, PIPE
 
 import smtplib
 from email.mime.text import MIMEText
@@ -61,26 +61,33 @@
 ## Fatal errors
 def gcm_fatal(smsg):
     gcm_print(u"ERROR: "+ smsg)
-    if cfg.email_ok and cfg.email:
+    if cfg.email_ok and cfg.email != "off":
         ## If e-mail is set, send e-mail
         msg = MIMEText(("\n".join(gcm_msgbuf)).encode("UTF-8"), "plain")
         msg.set_charset("UTF-8")
         msg["Subject"] = cfg.email_subject
         msg["From"] = cfg.email_sender
         msg["To"] = ",".join(cfg.email_to)
+        gcm_print("Sending mail to {0} from {1}, subj: {2} ..".format(";".join(cfg.email_to), cfg.email_sender, cfg.email_subject))
         try:
-            server = smtplib.SMTP(cfg.email_server)
-            if gcm_check_debug(4):
-                server.set_debuglevel(10)
+            if cfg.email == "smtp":
+                gcm_print("Using SMTP server {0}, login {1}".format(cfg.email_smtp_server, cfg.email_smtp_user))
+                server = smtplib.SMTP(cfg.email_smtp_server)
+                if gcm_check_debug(4):
+                    server.set_debuglevel(10)
 
-            if cfg.email_use_tls:
-                server.starttls()
+                if cfg.email_smtp_tls:
+                    server.starttls()
 
-            server.login(cfg.email_srv_user, cfg.email_srv_password)
-            server.sendmail(cfg.email_sender, cfg.email_to, msg.as_string())
-            server.quit()
+                server.login(cfg.email_smtp_user, cfg.email_smtp_password)
+                server.sendmail(cfg.email_sender, cfg.email_to, msg.as_string())
+                server.quit()
+            elif cfg.email == "sendmail":
+                gcm_print("Using sendmail {0}".format(cfg.email_sendmail))
+                p = Popen([cfg.email_sendmail, "-t", "-oi"], stdin=PIPE)
+                p.communicate(msg.as_string())
         except Exception as e:
-            gcm_print(u"FATAL: Oh crap, e-mail sending failed: {0}".format(str(e)))
+            gcm_print(u"FATAL: Oh noes, e-mail sending failed: {0}".format(str(e)))
     sys.exit(1)
 
 
@@ -316,6 +323,15 @@
     def trans_log_level(self, mvalue):
         return mvalue.upper()
 
+    def is_email_state(self, mvalue):
+        if not self.is_str(mvalue):
+            return False
+        else:
+            return mvalue.lower() in [u"off", u"sendmail", u"smtp"]
+
+    def trans_email_state(self, mvalue):
+        return mvalue.lower()
+
     def is_filename(self, mvalue):
         if not self.is_str(mvalue):
             return False
@@ -388,15 +404,17 @@
 cfg.mdef("debug", True, cfg.is_bool, cfg.trans_bool, False)
 
 cfg.mdef("email_ok", False, None, None, False)
-cfg.mdef("email", True, cfg.is_bool, cfg.trans_bool, False)
+cfg.mdef("email", True, cfg.is_email_state, cfg.trans_email_state, u"off")
+
 cfg.mdef("email_to", True, cfg.is_email_list, cfg.trans_email_list, None)
 cfg.mdef("email_sender", True, cfg.is_email, None, None)
 cfg.mdef("email_subject", True, cfg.is_string, None, u"Google Calendar MultiMerge status")
 
-cfg.mdef("email_use_tls", True, cfg.is_bool, cfg.trans_bool, False)
-cfg.mdef("email_server", True, cfg.is_string, None, None)
-cfg.mdef("email_srv_user", True, cfg.is_string, None, None)
-cfg.mdef("email_srv_password", True, cfg.is_string, None, None)
+cfg.mdef("email_sendmail", True, cfg.is_string, None, "/usr/sbin/sendmail")
+cfg.mdef("email_smtp_tls", True, cfg.is_bool, cfg.trans_bool, False)
+cfg.mdef("email_smtp_server", True, cfg.is_string, None, None)
+cfg.mdef("email_smtp_user", True, cfg.is_string, None, None)
+cfg.mdef("email_smtp_password", True, cfg.is_string, None, None)
 
 cfg.mdef("src_regex", True, cfg.is_string, None, u"^R:\s*(.*?)\s*\(\s*(.+?)\s*\)\s*$")
 cfg.mdef("src_regmap", False, cfg.is_list, cfg.trans_list, [1, 2])
@@ -447,7 +465,7 @@
 
 
 ## Validate settings
-if cfg.email:
+if cfg.email != "off":
     if cfg.email_subject == None or len(cfg.email_subject) == 0:
         gcm_fatal(u"E-mail enabled but email_subject not set.")
     elif cfg.email_sender == None: