Add Python (test) version of mail-instructions.pl
This commit is contained in:
		
							parent
							
								
									116081ba31
								
							
						
					
					
						commit
						14e1a9a3fc
					
				
					 1 changed files with 100 additions and 0 deletions
				
			
		
							
								
								
									
										100
									
								
								bin/mail-instructions.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								bin/mail-instructions.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,100 @@ | ||||||
|  | #!/usr/bin/python | ||||||
|  | 
 | ||||||
|  | # Script to send instructions to all voters. | ||||||
|  | # | ||||||
|  | # How to use this script | ||||||
|  | # ====================== | ||||||
|  | # | ||||||
|  | # You probably want to first update the subject of the e-mail that will be | ||||||
|  | # sent. The second line of the instructions.txt will be the subject. | ||||||
|  | # | ||||||
|  | # So let's suppose that the instructions are in instructions.txt and that you | ||||||
|  | # made a list of voters in maildata.txt (probably using create-tmp-tokens.pl). | ||||||
|  | # The format of this file should be: | ||||||
|  | # name;email;token | ||||||
|  | # | ||||||
|  | # You should use this script like this: | ||||||
|  | # $ ./mail-instructions.pl maildata.txt instructions.txt | ||||||
|  | # | ||||||
|  | # This script needs a MTA to send the e-mails. If you don't have one or if | ||||||
|  | # you're not sure that your ISP allows you to directly send mails, it's | ||||||
|  | # probably better and safer to run the script from a gnome.org server. | ||||||
|  | # Please test this script with your own email address by creating a  | ||||||
|  | # maildata.txt with a single entry like | ||||||
|  | # foo;your@address;bar | ||||||
|  | # | ||||||
|  | # You may want to look at your mail server logs (and maybe keep them) to | ||||||
|  | # know if the mail was delivered. There are usually 10-15 errors. In case of | ||||||
|  | # such errors, you can try to look for the new e-mail addresses of the voters | ||||||
|  | # to ask them if they want to update their registered e-mail address and | ||||||
|  | # receive the instructions. | ||||||
|  | 
 | ||||||
|  | import smtplib | ||||||
|  | import sys | ||||||
|  | from email.mime.text import MIMEText | ||||||
|  | 
 | ||||||
|  | re_template_fixes = [ | ||||||
|  |     (re.compile(r'^(\s*Dear )<member>'), '\1 $member'), | ||||||
|  |     (re.compile(r'^(\s*E-mail:)'), '\1 $email'), | ||||||
|  |     (re.compile(r'^(\s*Vote token:)'), '\1 $token') | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | sub email_it(recipients_file, instructions_file): | ||||||
|  |     instructions = file(instructions_file, "r").read().splitlines() | ||||||
|  | 
 | ||||||
|  |     from_header = instructions.pop(0) | ||||||
|  |     subject_header = instructions.pop(0) | ||||||
|  | 
 | ||||||
|  |     template = string.Template("\n".join(instructions)) | ||||||
|  |     for re_fix in re_template_fixes: | ||||||
|  |         template = re_fix[0].sub(re_fix[1], template) | ||||||
|  | 
 | ||||||
|  |     f = file(recipients_file, "r") | ||||||
|  | 
 | ||||||
|  |     sent = 0 | ||||||
|  |     errors = 0 | ||||||
|  |     s = None | ||||||
|  | 
 | ||||||
|  |     for line in f: | ||||||
|  |         l = line.strip() | ||||||
|  |         if l.beginswith("#") or l = "": | ||||||
|  |             continue | ||||||
|  | 
 | ||||||
|  |         l = l.split(";", 2) | ||||||
|  |         if len(l) <> 2: | ||||||
|  |             print "ERROR in recipients file, invalid line:" | ||||||
|  |             print line, | ||||||
|  |             continue | ||||||
|  | 
 | ||||||
|  |         member_name, member_email, token = l | ||||||
|  | 
 | ||||||
|  |         msg = MIMEText(template.substitute(member=member_name, email=member_email, token=token)) | ||||||
|  |         msg['To'] = member_email | ||||||
|  |         msg['From'] = from_header | ||||||
|  |         msg['Subject'] = subject_header | ||||||
|  | 
 | ||||||
|  |         if s is None: | ||||||
|  |             s = smtplib.SMTP() | ||||||
|  | 
 | ||||||
|  |         try: | ||||||
|  |             s.sendmail(from_header, ['olav@bkor.dhs.org'], msg.as_string()) | ||||||
|  |         except smtplib.SMTPException: | ||||||
|  |             print "Error: Could not send to %s (%s)!" % (member_email, member_name) | ||||||
|  |             errors += 1 | ||||||
|  |         else: | ||||||
|  |             sent += 1 | ||||||
|  | 
 | ||||||
|  |     if s: | ||||||
|  |         s.quit() | ||||||
|  | 
 | ||||||
|  |     f.close() | ||||||
|  | 
 | ||||||
|  |     print "Mailed %s instructions; %s could not be mailed." % (sent, errors) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     if len(sys.argv) != 2: | ||||||
|  |         print "Usage: mail-instructions.py <recipient list> <instructions template>" | ||||||
|  |         sys.exit(1) | ||||||
|  | 
 | ||||||
|  |     email_it(sys.argv[1], sys.argv[2]) | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Olav Vitters
						Olav Vitters