classify-users: determine type of Athena accounts
[user/alex/software/my-snippets.git] / mail-merge
index 4e5f3531a96de2b042389094732df90a967d3afe..5de621e0098b4dc3bd46862c56d265255b92d7b6 100755 (executable)
@@ -33,6 +33,8 @@ def sendmail_cmd(addrs, text):
     args.extend(addrs)
     proc = subprocess.Popen(args, stdin=subprocess.PIPE)
     proc.communicate(text)
+    if proc.returncode != 0:
+        raise RuntimeError, "sendmail returned %d" % (proc.returncode, )
 cmd_funcs = (lambda: True, sendmail_cmd)
 
 setup_sendmail, sendmail = smtp_funcs
@@ -48,6 +50,10 @@ def parse_arguments():
             help='Set RT owner and AdminCC to USER',
             metavar='USER',
     )
+    parser.add_option('--split', dest='split',
+            help='Split "email" field on SPLIT and send to each recipient',
+            metavar='SPLIT',
+    )
     (options, args) = parser.parse_args()
     if len(args) != 3:
         parser.error("incorrect number of arguments")
@@ -55,8 +61,8 @@ def parse_arguments():
         parser.error("--rt-owner requires specifying a queue")
     return options, args
 
-def nop_msg_filter(rcpt, body):
-    return rcpt, body
+def nop_msg_filter(rcpts, body):
+    return rcpts, body
 
 def msg_filter_factory(opts):
     if not opts.rt_queue:
@@ -73,11 +79,11 @@ def msg_filter_factory(opts):
     resource = rtkit.resource.RTResource.from_rtrc(cookie)
     parser = email.parser.Parser()
 
-    def filter_rt(rcpt, body, ):
+    def filter_rt(rcpts, body, ):
         msg = parser.parsestr(body)
         content = {
             'content': {
-                'Requestors': rcpt,
+                'Requestors': ", ".join(rcpts),
                 'Queue': opts.rt_queue,
                 'Subject' : msg['Subject'],
                 'Text' : '',
@@ -102,24 +108,29 @@ def msg_filter_factory(opts):
 
         # We don't want to send mail to the real recipient, because RT
         # will send them a copy too.
-        return None, msg.as_string()
+        return [], msg.as_string()
 
     return filter_rt
 
 def mail_merge(opts, cc_addr, email_file, recipients_file):
-    email_tmpl = open(email_file, 'r').read()
-    reader = csv.reader(open(recipients_file, 'r'))
+    email_tmpl = open(email_file, 'rU').read()
+    reader = csv.reader(open(recipients_file, 'rU'))
     header = reader.next()
     msg_filter = msg_filter_factory(opts)
     print header
+    if not 'email' in header:
+        print >>sys.stderr, "Your CSV file doesn't have an email field. You should fix that.\n(Note that this script is case-sensitive.)"
+        return False
     for line in reader:
         dct = dictize_line(header, line, )
         print dct
         text = email_tmpl % dct
-        rcpt, text = msg_filter(dct['email'], text, )
-        rcpts = [cc_addr]
-        if rcpt:
-            rcpts.append(rcpt)
+        if opts.split:
+            prop_rcpts = dct['email'].split(opts.split)
+        else:
+            prop_rcpts = [dct['email']]
+        rcpts, text = msg_filter(prop_rcpts, text, )
+        rcpts.append(cc_addr)
         sendmail(rcpts, text, )
 
 if __name__=='__main__':