learn sending emails in python

If you are a working professional and your job is to send a lot of emails to the client or customers on daily basis. Then this will be a very hectic task for you as compose mail for each person in the list.

Python includes several modules in the standard library for working with emails and email servers. As a learning exercise, I recently worked with Python 3 to see how I could use python for sending emails using smtp servers. Here I am writing a tutorial for the same.



Before starting there are few prerequisites you must have -
  •  You must have python installed in your system.

  • Working Internet

Python has various libraries to work with emails. We will use smtplib.

smtplib:
SMTP stands for Simple Mail Transfer Protocol.
smtplib module defines an SMTP client session object and we will use this object to send emails in python to any internet machine with SMTP or ESMTP listener.

Sending emails in python is done using smtplib module using SMTP server.

Actual usage varies depending upon the complexity of email as for detailed emails we also need to use email module. The tutorial given below is for sending emails in python through Gmail.


Basic Script to send emails in Python:

First of all, you need to create an SMTP object and each object you create will be used for connection with one server

import smtplib
server = smtplib.SMTP('smtp.gmail.com', 587)

Next, we need to login to the server - 

server.login("youremailusername", "password")

And now send the email - 

msg = "\nHello!" # The /n separates the message from the headers (which we ignore for this example)
server.sendmail("you@gmail.com", "target@example.com", msg)


The script written above is very basic without header, subject etc. We will use email module to make it more advanced.


email module overview:
Python's email package contains many classes and functions for composing and parsing email messages. We will cover only a small section that is used to send emails.

Use of email package:
We can directly import email module but if we do this we need to write full module name. So we only import classes that are needed.

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

After importing the required classes we will compose some of the basic headers.

fromaddr = "you@gmail.com"
toaddr = "target@example.com"
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "Python email"

now we will attach the body of the message to MIME(multipurpose internal mail extension) message.

body = "sending test emails using python"
msg.attach(MIMEText(body, 'plain'))

for sending the email we need to convert the message to string and then use the same procedure as above to send email using the SMTP server.

import smtplib
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.ehlo()
server.login("youremailusername", "password")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)

Writing a function to send emails using Gmail in Python:
We will write a function which can return a dictionary of any addresses it could not forward to and other connetion problems raise errors.

import smtplib
 
def sendemail(from_addr, to_addr_list, cc_addr_list,
              subject, message,
              login, password,
              smtpserver='smtp.gmail.com:587'):
    header  = 'From: %s\n' % from_addr
    header += 'To: %s\n' % ','.join(to_addr_list)
    header += 'Cc: %s\n' % ','.join(cc_addr_list)
    header += 'Subject: %s\n\n' % subject
    message = header + message
 
    server = smtplib.SMTP(smtpserver)
    server.starttls()
    server.login(login,password)
    problems = server.sendmail(from_addr, to_addr_list, message)
    server.quit()
    return problems

Call the above function to send emails:

sendemail(from_addr    = 'python@RC.net', 
          to_addr_list = ['RC@gmail.com'],
          cc_addr_list = ['RC@xx.co.uk'], 
          subject      = 'Howdy', 
          message      = 'Howdy from a python function', 
          login        = 'pythonuser', 
          password     = 'XXXXX')

Comments