Deliver emails to Cc in smtplib code path

Message ID 20200827111459.57672-1-lfleischer@archlinux.org
State New
Headers show
Series
  • Deliver emails to Cc in smtplib code path
Related show

Commit Message

Lukas Fleischer Aug. 27, 2020, 11:14 a.m. UTC
When using the sendmail() function with smtplib.SMTP or
smtplib.SMTP_SSL, the list of actual recipients for the email (to be
translated to RCPT commands) has to be provided as a parameter.

Update the notification script and add all Cc recipients to that
parameter.

Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
---
 aurweb/scripts/notify.py | 18 ++++++++++++------
 test/t2500-notify.t      | 16 +++++++++++++---
 2 files changed, 25 insertions(+), 9 deletions(-)

Patch

diff --git a/aurweb/scripts/notify.py b/aurweb/scripts/notify.py
index 79cf633..b698bd7 100755
--- a/aurweb/scripts/notify.py
+++ b/aurweb/scripts/notify.py
@@ -14,10 +14,6 @@  import aurweb.l10n
 aur_location = aurweb.config.get('options', 'aur_location')
 
 
-def headers_cc(cclist):
-    return {'Cc': str.join(', ', cclist)}
-
-
 def headers_msgid(thread_id):
     return {'Message-ID': thread_id}
 
@@ -53,6 +49,9 @@  class Notification:
     def get_headers(self):
         return {}
 
+    def get_cc(self):
+        return []
+
     def get_body_fmt(self, lang):
         body = ''
         for line in self.get_body(lang).splitlines():
@@ -80,6 +79,8 @@  class Notification:
             msg['From'] = sender
             msg['Reply-to'] = reply_to
             msg['To'] = to
+            if self.get_cc():
+                msg['Cc'] = str.join(', ', self.get_cc())
             msg['X-AUR-Reason'] = reason
             msg['Date'] = email.utils.formatdate(localtime=True)
 
@@ -116,6 +117,7 @@  class Notification:
                     server.login(user, passwd)
 
                 server.set_debuglevel(0)
+                deliver_to = [to] + self.get_cc()
                 server.sendmail(sender, to, msg.as_bytes())
                 server.quit()
 
@@ -450,6 +452,9 @@  class RequestOpenNotification(Notification):
     def get_recipients(self):
         return [(self._to, 'en')]
 
+    def get_cc(self):
+        return self._cc
+
     def get_subject(self, lang):
         return '[PRQ#%d] %s Request for %s' % \
                (self._reqid, self._reqtype.title(), self._pkgbase)
@@ -478,7 +483,6 @@  class RequestOpenNotification(Notification):
         # Use a deterministic Message-ID for the first email referencing a
         # request.
         headers = headers_msgid(thread_id)
-        headers.update(headers_cc(self._cc))
         return headers
 
 
@@ -509,6 +513,9 @@  class RequestCloseNotification(Notification):
     def get_recipients(self):
         return [(self._to, 'en')]
 
+    def get_cc(self):
+        return self._cc
+
     def get_subject(self, lang):
         return '[PRQ#%d] %s Request for %s %s' % (self._reqid,
                                                   self._reqtype.title(),
@@ -538,7 +545,6 @@  class RequestCloseNotification(Notification):
     def get_headers(self):
         thread_id = '<pkg-request-' + str(self._reqid) + '@aur.archlinux.org>'
         headers = headers_reply(thread_id)
-        headers.update(headers_cc(self._cc))
         return headers
 
 
diff --git a/test/t2500-notify.t b/test/t2500-notify.t
index 5ef64c1..713b31e 100755
--- a/test/t2500-notify.t
+++ b/test/t2500-notify.t
@@ -277,13 +277,18 @@  test_expect_success 'Test subject and body of merge notifications.' '
 	test_cmp actual expected
 '
 
-test_expect_success 'Test subject and body of request open notifications.' '
+test_expect_success 'Test Cc, subject and body of request open notifications.' '
 	cat <<-EOD | sqlite3 aur.db &&
 	/* Use package request IDs which can be distinguished from other IDs. */
-	INSERT INTO PackageRequests (ID, PackageBaseID, PackageBaseName, UsersID, ReqTypeID, Comments, ClosureComment) VALUES (3001, 1001, "foobar", 1, 1, "This is a request test comment.", "");
+	INSERT INTO PackageRequests (ID, PackageBaseID, PackageBaseName, UsersID, ReqTypeID, Comments, ClosureComment) VALUES (3001, 1001, "foobar", 2, 1, "This is a request test comment.", "");
 	EOD
 	>sendmail.out &&
 	"$NOTIFY" request-open 1 3001 orphan 1001 &&
+	grep ^Cc: sendmail.out >actual &&
+	cat <<-EOD >expected &&
+	Cc: user@localhost, tu@localhost
+	EOD
+	test_cmp actual expected &&
 	grep ^Subject: sendmail.out >actual &&
 	cat <<-EOD >expected &&
 	Subject: [PRQ#3001] Orphan Request for foobar
@@ -324,9 +329,14 @@  test_expect_success 'Test subject and body of request open notifications for mer
 	test_cmp actual expected
 '
 
-test_expect_success 'Test subject and body of request close notifications.' '
+test_expect_success 'Test Cc, subject and body of request close notifications.' '
 	>sendmail.out &&
 	"$NOTIFY" request-close 1 3001 accepted &&
+	grep ^Cc: sendmail.out >actual &&
+	cat <<-EOD >expected &&
+	Cc: user@localhost, tu@localhost
+	EOD
+	test_cmp actual expected &&
 	grep ^Subject: sendmail.out >actual &&
 	cat <<-EOD >expected &&
 	Subject: [PRQ#3001] Deletion Request for foobar Accepted