[v4,1/2] Support smtplib for sending emails

Message ID 20200210195310.145150-1-lfleischer@archlinux.org
State New
Headers show
Series
  • [v4,1/2] Support smtplib for sending emails
Related show

Commit Message

Lukas Fleischer Feb. 10, 2020, 7:53 p.m. UTC
Support mail delivery without a local MTA. Instead, an SMTP server can
now be configured using the smtp-server option in the [notifications]
section. In order to use this option, the value of the sendmail option
must be empty.

Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
---
 aurweb/scripts/notify.py | 22 ++++++++++++++++++----
 conf/config.defaults     |  3 ++-
 2 files changed, 20 insertions(+), 5 deletions(-)

Patch

diff --git a/aurweb/scripts/notify.py b/aurweb/scripts/notify.py
index b0f218b..941187e 100755
--- a/aurweb/scripts/notify.py
+++ b/aurweb/scripts/notify.py
@@ -1,6 +1,8 @@ 
 #!/usr/bin/env python3
 
 import email.mime.text
+import email.utils
+import smtplib
 import subprocess
 import sys
 import textwrap
@@ -63,7 +65,6 @@  class Notification:
         return body.rstrip()
 
     def send(self):
-        sendmail = aurweb.config.get('notifications', 'sendmail')
         sender = aurweb.config.get('notifications', 'sender')
         reply_to = aurweb.config.get('notifications', 'reply-to')
         reason = self.__class__.__name__
@@ -79,13 +80,26 @@  class Notification:
             msg['Reply-to'] = reply_to
             msg['To'] = to
             msg['X-AUR-Reason'] = reason
+            msg['Date'] = email.utils.formatdate(localtime=True)
 
             for key, value in self.get_headers().items():
                 msg[key] = value
 
-            p = subprocess.Popen([sendmail, '-t', '-oi'],
-                                 stdin=subprocess.PIPE)
-            p.communicate(msg.as_bytes())
+            sendmail = aurweb.config.get('notifications', 'sendmail')
+            if sendmail:
+                # send email using the sendmail binary specified in the
+                # configuration file
+                p = subprocess.Popen([sendmail, '-t', '-oi'],
+                                     stdin=subprocess.PIPE)
+                p.communicate(msg.as_bytes())
+            else:
+                # send email using smtplib; no local MTA required
+                server_addr = aurweb.config.get('notifications', 'smtp-server')
+
+                server = smtplib.SMTP(server_addr)
+                server.set_debuglevel(1)
+                server.sendmail(sender, recipient, msg.as_bytes())
+                server.quit()
 
 
 class ResetKeyNotification(Notification):
diff --git a/conf/config.defaults b/conf/config.defaults
index c519eae..23d46b0 100644
--- a/conf/config.defaults
+++ b/conf/config.defaults
@@ -47,7 +47,8 @@  window_length = 86400
 
 [notifications]
 notify-cmd = /usr/local/bin/aurweb-notify
-sendmail = /usr/bin/sendmail
+sendmail =
+smtp-server = localhost
 sender = notify@aur.archlinux.org
 reply-to = noreply@aur.archlinux.org