Python Program to Merge Mails

Spread the love

The practice of sending personalized emails in bulk is known as mail merge. This task can often seem daunting, but Python’s versatile programming capabilities make it simple and efficient. Python’s libraries like smtplib for sending emails, csv for handling CSV files, and string.Template for string formatting enable developers to automate the entire process.

In this comprehensive guide, we will break down how to execute a Python program to merge mails. Our discussion will include:

  1. The Concept of Mail Merge
  2. Setting Up Email Server with smtplib
  3. Using CSV Files for Personalized Data
  4. Loading Email Templates
  5. Merging and Sending Emails
  6. Exception Handling
  7. Real-world Applications
  8. Conclusion

The Concept of Mail Merge

Mail merge is the process of sending a single email template to multiple recipients but with certain unique personalizations. These personalizations may include:

  • First Name
  • Last Name
  • Order Details
  • Dates

By using mail merge, you can make your emails more personal, which often leads to better engagement rates.

Setting Up Email Server with smtplib

The Simple Mail Transfer Protocol (SMTP) is an internet standard for email transmission. Python’s smtplib library provides the functionalities to set up an SMTP server.

Python Code

import smtplib

def setup_server():
    server = smtplib.SMTP('', 587)
    server.login("", "your-password")
    return server


  • Import the smtplib module.
  • Connect to Gmail’s SMTP server using its domain and port.
  • Initialize TLS encryption for secure communication.
  • Log in using your Gmail email and password.

Note: Make sure to allow less secure apps for your Gmail account.

Using CSV Files for Personalized Data

Python’s built-in csv module allows you to read from and write to CSV files, which often serve as data sources for mail merge.

Python Code

import csv

def read_csv(filename):
    with open(filename, mode ='r') as file:
        csvFile = csv.reader(file)
        fields = next(csvFile)
        for row in csvFile:
            yield {fields[i]: row[i] for i in range(len(fields))}


  • Import the csv module.
  • Open the CSV file in read mode.
  • Use the csv.reader() method to read the file.
  • Yield a dictionary for each row, where the keys are the field names and the values are the corresponding values in the row.

Loading Email Templates

The string.Template module in Python can substitute variables inside a string with actual values.

Python Code

from string import Template

def load_template(filename):
    with open(filename, 'r', encoding='utf-8') as file:
        content =
    return Template(content)


  • Import Template from the string module.
  • Open the email template file.
  • Read the content and return a Template object.

Merging and Sending Emails

The ultimate task is to combine everything and send the emails.

Python Code

def send_mails(server, template, recipients_csv):
    for recipient in read_csv(recipients_csv):
        msg = template.substitute(recipient)
        server.sendmail("", recipient["email"], msg)


  • Loop through each recipient’s data from the CSV file.
  • Use the substitute method of the Template class to replace variables in the template.
  • Use the sendmail method of the SMTP server to send the email.

Exception Handling

Make sure to handle exceptions that can occur during SMTP communications or file operations.

    server = setup_server()
    template = load_template("email_template.txt")
    send_mails(server, template, "recipients.csv")
except Exception as e:
    print(f"An error occurred: {e}")

Real-world Applications

  1. Marketing Campaigns: Personalized bulk emails for product promotions.
  2. Employee Communication: Automating corporate announcements.
  3. Event Invitations: Sending tailored invitations for events.
  4. Notifications: Sending alert emails to users based on their activities.
  5. Invoicing: Sending invoices to customers with personalized details.


Mail merge is a potent tool in modern communication, and Python provides an incredibly flexible and efficient way to execute this. Whether it’s for marketing, internal communication, or user engagement, Python’s rich standard library and straightforward syntax make implementing a mail merge system surprisingly simple.

Understanding each component—SMTP server setup, CSV data manipulation, email template loading, and finally, the mail merging and sending process—is crucial for building a robust mail merge system. With the added layer of exception handling, you can ensure your program runs smoothly, even when faced with unexpected challenges.

Leave a Reply