How to Send Emails in Python using smtplib Module

Abdou Rockikz · 21 nov 2019

Abdou Rockikz · 5 min read · Python Standard Library

Sending emails manually is no doubt a time-consuming and tough task, a programmer can easily automate this using his favorite programming language, in this tutorial, you will learn how you can send emails using smtplib module in Python.

The smtplib module defines an SMTP client session object that can be used to send mail to any Internet machine with an SMTP (or Extended-SMTP) listener. It comes pre-installed with Python, so we don't have to install anything.

If you're not sure what SMTP (Simple Mail Transfer Protocol) is, it is basically a communication protocol for electronic mail transmission, it was first introduced in 1982 and updated in 2008 by RFC 5321 to Extended SMTP additions (which is what's used today). So in a nutshell, mail servers use this protocol to send mail messages.

Related: How to Manipulate IP Addresses in Python using ipaddress Module.

Alright, let's get started, let's send our email:

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

We gonna need email module as well, as it provides us with the MIME standard, which will help us send not only ASCII character set emails, but larger character sets, HTML, audio, video, etc.

Message bodies with MIME formatting consist of multiple parts, each part may contain any type of data you actually want to send.

Let's define our parameters:

# your credentials
email = "email@example.com"
password = "password"

# the sender's email
FROM = "from@example.com"
# the receiver's email
TO   = "to@example.com"
# the subject of the email (subject)
subject = "Just a subject"

Pretty straightforward, email and password variables are the credentials of the email address you wanna send with, FROM and TO are the sender's email and receiver's email respectively (email and FROM are usually the same), and subject is the title (or subject) of the mail we'll send. Make sure you edit these variables on your own needs, you can send to multiple email addresses by using a list of emails in TO variable.

Now let's construct our mail, we gonna use MIMEMultipart object here, so we can attach multiple parts of the mail such as HTML, image and so on.

# initialize the message we wanna send
msg = MIMEMultipart()
# set the sender's email
msg["From"] = FROM
# set the receiver's email
msg["To"] = TO
# set the subject
msg["Subject"] = subject

Note: If you're using Gmail account to send, make sure you turn "Allow less secure apps" to ON, although this will make everyone can access your gmail account just with your email and password.

We also set the From, To email addresses and the subject. Let's construct the message body, I'm gonna use HTML in this example:

# set the body of the email
text = MIMEText("This email is sent using <b>Python</b> !", "html")
# attach this body to the email
msg.attach(text)

After the construction of the message body, we attached it to the MIMEMultipart object we just created. Let's see how this email looks like:

print(msg.as_string())

Output:

Content-Type: multipart/mixed; boundary="===============3518853130198016098=="
MIME-Version: 1.0
From: email@example.com
To: to@example.com
Subject: Just a subject

--===============3518853130198016098==
Content-Type: text/html; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

This email is sent using <b>Python</b> !
--===============3518853130198016098==--

As you may notice, each part is separated with a fixed set of characters, the first part contains the mail header, the second contains the actual message body we just attached, note that if there is any non ASCII characters, it'll automatically change the encoding for us, so you usually don't have to worry about that. For more information about the MIME standard, check this Wikipedia page.

You can also attach other file types using email module, for example, if you want to send audio files, you can use MIMEAudio class from the email.mime.audio package, please refer to the official Python documentation for detailed information.

Now that we have the mail ready to be sent, let's connect to the SMTP server using smtplib:

# initialize the SMTP server
server = smtplib.SMTP("smtp.gmail.com", 587)

I've used Gmail SMTP server here, with the port 587. If you want other SMTP servers, check the list of SMTP servers and its port numbers.

Putting the connection to the SMTP server into TLS mode:

# connect to the SMTP server as TLS mode (secure) and send EHLO
server.starttls()

And finally, we login using the account credentials and terminate the session after we send the email:

# login to the account using the credentials
server.login(email, password)
# send the email
server.sendmail(FROM, TO, msg.as_string())
# terminate the SMTP session
server.quit()

After I executed this piece of code (of course I used real gmail credentials), here is the screenshots of the email received:

Email Received

Opened email after the receive

Awesome, see what you can do with this ! You can now create your own custom alerts to notify you when something happened, or you want to send email confirmation to users when they create an account on your website, or send emails to members of your organization, or sending keylogger results, possibilities are endless !

Let us see what you built with this in the comments below !

Learn Also: How to Use Pickle for Object Serialization in Python.

Happy Coding ♥

View Full Code
Sharing is caring!


Read Also





Comment panel

   
Comment system is still in Beta, if you find any bug, please consider contacting us here.