Mail merge with python
Posted April 16, 2013 at 04:10 PM | categories: email, programming | tags:
Suppose you are organizing some event, and you have a mailing list of email addresses and people you need to send a mail to telling them what room they will be in. You would like to send a personalized email to each person, and you do not want to type each one by hand. Python can automate this for you. All you need is the mailing list in some kind of structured format, and then you can go through it line by line to create and send emails.
We will use an org-table to store the data in.
First name | Last name | email address | Room number |
---|---|---|---|
Jane | Doe | jane-doe@gmail.com | 1 |
John | Doe | john-doe@gmail.com | 2 |
Jimmy | John | jimmy-john@gmail.com | 3 |
We pass that table into an org-mode source block as a variable called data, which will be a list of lists, one for each row of the table. You could alternatively read these from an excel spreadsheet, a csv file, or some kind of python data structure.
We do not actually send the emails in this example. To do that you need to have access to a mail server, which could be on your own machine, or it could be a relay server you have access to.
We create a string that is a template with some fields to be substituted, e.g. the firstname and room number in this case. Then we loop through each row of the table, and format the template with those values, and create an email message to the person. First we print each message to check that they are correct.
import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.Utils import formatdate template = ''' Dear {firstname:s}, I am pleased to inform you that your talk will be in room {roomnumber:d}. Sincerely, John ''' for firstname, lastname, emailaddress, roomnumber in data: msg = MIMEMultipart() msg['From'] = "youremail@gmail.com" msg['To'] = emailaddress msg['Date'] = formatdate(localtime=True) msgtext = template.format(**locals()) print msgtext msg.attach(MIMEText(msgtext)) ## Uncomment these lines and fix #server = smtplib.SMTP('your.relay.server.edu') #server.sendmail('your_email@gmail.com', # from # emailaddress, # msg.as_string()) #server.quit() print msg.as_string() print '------------------------------------------------------------------'
Dear Jane, I am pleased to inform you that your talk will be in room 1. Sincerely, John Content-Type: multipart/mixed; boundary="===============1191311863==" MIME-Version: 1.0 From: youremail@gmail.com To: jane-doe@gmail.com Date: Tue, 16 Apr 2013 16:10:23 -0400 --===============1191311863== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Dear Jane, I am pleased to inform you that your talk will be in room 1. Sincerely, John --===============1191311863==-- ------------------------------------------------------------------ Dear John, I am pleased to inform you that your talk will be in room 2. Sincerely, John Content-Type: multipart/mixed; boundary="===============1713881863==" MIME-Version: 1.0 From: youremail@gmail.com To: john-doe@gmail.com Date: Tue, 16 Apr 2013 16:10:23 -0400 --===============1713881863== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Dear John, I am pleased to inform you that your talk will be in room 2. Sincerely, John --===============1713881863==-- ------------------------------------------------------------------ Dear Jimmy, I am pleased to inform you that your talk will be in room 3. Sincerely, John Content-Type: multipart/mixed; boundary="===============0696685580==" MIME-Version: 1.0 From: youremail@gmail.com To: jimmy-john@gmail.com Date: Tue, 16 Apr 2013 16:10:23 -0400 --===============0696685580== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Dear Jimmy, I am pleased to inform you that your talk will be in room 3. Sincerely, John --===============0696685580==-- ------------------------------------------------------------------
Copyright (C) 2013 by John Kitchin. See the License for information about copying.