Limitation of normal mail merge is that you can't insert Cc/Bcc fields into it. I have tried to overcome this by writing a small script. The script takes the recipients in To and recipients in Cc fields from an excel sheet. It reads the sheet one by one from both columns and send them emails reading on the contents from an external fields. Yes, it's simple, but what I was trying earlier was something else. I was trying to send 'personalized' emails with 'Cc' field in the mail. But the 'personalized' part is very difficult to implement, as I was not able to write the variable data to the body of the email. So, settled down with this fixed body contents being read from external file. Let me know if anybody is aware of how to send personalized body contents to respective users. I mean the some fields in the body of the mail should on user basis. In this case the body of the mail is general and fixed in nature.
Code to read user lists from excel and send the email inserting Cc field:
import smtplib
import sys
import xlrd
from email.mime.text import MIMEText
def SendEmail(emailTo,CCname):
# Open the file to read the contents
fp = open('C:\.......\mailcontents.txt', 'rb')
msg = MIMEText(fp.read())
fp.close()
#pouplate the msg container fields
msg['Subject']= "Test mail!"
msg['From']='myslef@abcorg.com'
msg['To']=emailTo
msg['Cc']=CCname
# finally send the email
s = smtplib.SMTP('smtp.abcorg.com')
s.sendmail(msg['From'], [emailTo,CCname], msg.as_string())
s.quit()
# Open the excelsheet containing mail records such as, To, CC
wb=xlrd.open_workbook ('C:\......\mailRecord.xlsx')
wb.sheet_names()
sh=wb.sheet_by_index(0)
for rownum in range(sh.nrows):
emailTo=str(sh.cell(rownum,0).value) # The To field in first coloumn
CCname=str(sh.cell(rownum,1).value) #The CC field in second coloumn
SendEmail(emailTo,CCname) # Call the function above
import sys
import xlrd
from email.mime.text import MIMEText
def SendEmail(emailTo,CCname):
# Open the file to read the contents
fp = open('C:\.......\mailcontents.txt', 'rb')
msg = MIMEText(fp.read())
fp.close()
#pouplate the msg container fields
msg['Subject']= "Test mail!"
msg['From']='myslef@abcorg.com'
msg['To']=emailTo
msg['Cc']=CCname
# finally send the email
s = smtplib.SMTP('smtp.abcorg.com')
s.sendmail(msg['From'], [emailTo,CCname], msg.as_string())
s.quit()
# Open the excelsheet containing mail records such as, To, CC
wb=xlrd.open_workbook ('C:\......\mailRecord.xlsx')
wb.sheet_names()
sh=wb.sheet_by_index(0)
for rownum in range(sh.nrows):
emailTo=str(sh.cell(rownum,0).value) # The To field in first coloumn
CCname=str(sh.cell(rownum,1).value) #The CC field in second coloumn
SendEmail(emailTo,CCname) # Call the function above
Comments
http://office.microsoft.com/en-us/word-help/word-mail-merge-a-walk-through-the-process-HA001034920.aspx