Emails written using Hypertext Markup Language Code (HTML) have the unique feature of integrating graphics and embedded videos directly into the email. Customization of font and color and inclusion of add buttons are other characteristics. One way of doing this is to send HTML Emails with Python. Additionally, you can also use Outlook, which is a powerful email client. If you know how to add an HTML signature to Outlook, you are already one step ahead of others. 

There are two methods defined by their ease of use to send HTML Emails with Python. The first option is to use the Simple Mail Transfer Protocol through the ‘smtplib’ Library. Alternatively, you can rely on transactional email services such as SendGrid or Mailgun. 

Before sending emails with HTML, check your HTML offline storage space to avoid any difficulties. You should know how to free up HTML5 offline storage space if you face any inconvenience. To learn how the methods above work and for more queries on using Python for HTML Email, continue reading this further. 

2 Easy Methods to Send HTML Emails with Python 

To Send HTML Emails, Python provides either SMTP or Transactional Email Services. Learn more about both methods and pick one best suited for your needs. 

Method 1: Use SMTP 

According to local host RFC markup(5321), SMTP is viewed as a protocol for sending mail among computers. SMTP is an abbreviation for Simple Mail Transfer Protocol. It is the standard to send emails. You can use the ‘smtplib’ library when sending HTML Emails with Python.

smtp html code

SMTP allows for creating visually appealing and formatted emails, enhancing communication and engagement. For sending HTML emails using ‘smtplib’, you must follow these steps:

  • In the second step, you must give your SMTP server information and mention the security settings(TLS/SSL).

Now, we will utilize the email module to create email messages and can send them through your SMTP connection. 

Example

The complete code is mentioned below:


# import the necessary components first

import smtplib

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

port = 587

smtp_server = "live.smtp.mailtrap.io"

login = "1a2b3c4d5e6f7g" # paste your login generated by Mailtrap

password = "1a2b3c4d5e6f7g" # paste your password generated by Mailtrap

sender_email = "[email protected]"

receiver_email = "[email protected]"

message = MIMEMultipart("alternative")

message["Subject"] = "multipart test"

message["From"] = sender_email

message["To"] = receiver_email

# write the text/plain part

text = """\

Hi,

Check out the new post on the Mailtrap blog:

SMTP Server for Testing: Cloud-based or Local?

https://blog.mailtrap.io/2018/09/27/cloud-or-local-smtp-server/

Feel free to let us know what content would be useful for you!"""


<html>

<body>

<p>Hi,<br>

Check out the new post on the Mailtrap blog:</p>

<p><a href="https://blog.mailtrap.io/2018/09/27/cloud-or-local-smtp-server">SMTP Server for Testing: Cloud-based or Local?</a></p>

<p> Feel free to <strong>let us</strong> know what content would be useful for you!</p>

</body>

</html>


# convert both parts to MIMEText objects and add them to the MIMEMultipart message

part1 = MIMEText(text, "plain")

part2 = MIMEText(html, "html")

message.attach(part1)

message.attach(part2)

# send your email

with smtplib.SMTP("live.smtp.mailtrap.io", 587) as server:

server.login(login, password)

server.sendmail(

sender_email, receiver_email, message.as_string()

)

print('Sent')

<span data-preserver-spaces="true"> 

 

Method 2: Use Transactional Email Services 

Leveraging transactional email services in Python facilitates the seamless delivery of HTML emails. Services like SendGrid or Mailgun provide APIs that integrate effortlessly with Python scripts, ensuring reliable email delivery.

This approach streamlines the process, offering features like email tracking and analytics. By outsourcing email infrastructure to specialized services, developers can focus on content creation and application logic while ensuring efficient and reliable HTML email communication.

sendgrid and mailgun

Let’s look at a SendGrid code example, but before that, you have to keep some things in mind: 

  • Create a SendGrid account for free.
  • For user validation, get an API key.
  • Write setx SENDGRID_API_KEY “YOUR_API_KEY in your command prompt to preserve this key permanently.

Example

The code for SendGrid:


import os

import sendgrid

from sendgrid.helpers.mail import Content, Email, Mail

sg = sendgrid.SendGridAPIClient(

apikey=os.environ.get("SENDGRID_API_KEY")

)

from_email = Email("[email protected]")

to_email = Email("[email protected]")

subject = "A test email from Sendgrid"

content = Content(

"text/plain", "Here's a test email sent through Python"

)

mail = Mail(from_email, subject, to_email, content)

response = sg.client.mail.send.post(request_body=mail.get())

# The statements below can be included for debugging purposes

print(response.status_code)

print(response.body)

print(response.headers)

How to send HTML emails with attachments?

To send HTML emails containing Python containing attachments, one can use the ‘smtplib’ library and the ’email’ module. Construct the email message using ‘MIMEText’ for HTML content and ‘MIMEBase’ for attachments. You can attach anything as long as you use the correct class.

email with attachments

Then, encode and attach the files to the message. Establish an SMTP connection to the email server and send the email. This enables the inclusion of visually appealing HTML content along with relevant attachments, enhancing the overall communication experience. Furthermore, let’s look at the following code for attaching a pdf:


from email.mime.base import MIMEBase

from email import encoders

# Create a multi-part message

message = MIMEMultipart()

# Set the sender and recipient

message["From"] = "[email protected]"

message["To"] = "[email protected]"

# Set the subject

message["Subject"] = "HTML Email from Python"

# Attach a PDF file

pdf_file = "example.pdf"

attachment = open(pdf_file, "rb")

part = MIMEBase("application", "octet-stream")

part.set_payload((attachment).read())

encoders.encode_base64(part)

part.add_header("Content-Disposition", "attachment; filename=example.pdf")

message.attach(part)

# Connect to the SMTP server and send the email

with smtplib.SMTP("smtp.gmail.com", 587) as server:

server.starttls() # Enable TLS

server.login("[email protected]", "your_password")

server.send_message(message)

How to send HTML emails to multiple recipients using Python?

In Python HTML Email, mailing multiple recipients involves using the ‘smtplib’ library. The best way to send emails to numerous recipients is through a CSV file. Let’s look at the following code:

html chat box

import csv, smtplib

In the above code, we have imported CSV through which we will send emails to multiple recipients.


port = 587

smtp_server = "live.smtp.mailtrap.io"

login = "1a2b3c4d5e6f7g"

password = "1a2b3c4d5e6f7g"

sender = "<a class="editor-rtfLink" href="mailto:[email protected]" target="_blank" rel="noopener">[email protected]</a>"

The above code is used for configuration.

message = “””…

“””

In the above code, we have drafted an email template containing the sender, recipient, and name.


with smtplib.SMTP("live.smtp.mailtrap.io", 587) as server:

server.login(login, password)

We have successfully established a connection to send the email to the SMTP server.


with open("contacts.csv") as file:

reader = csv.reader(file)

next(reader) # it skips the header row

The above code reads the CSV file to send emails to multiple recipients.


for name, email in reader:

server.sendmail(

sender,

email,

message.format(name=name, recipient=email, sender=sender)

)

print(f'Sent to {name}')

The above code will loop through the contacts and send emails in the CSV file. Hence, you are all set to send emails to multiple recipients.

How to send HTML emails with images?

To send images in Python email HTML, use the ‘smtplib’ library, the ’email’ module, and CID attachments. Create a ‘MIMEMultipart’ object to handle HTML content and image attachments. Embed images within the HTML using ‘MIMEImage’ and set the appropriate content types.

HTML Banner Code

Establish an SMTP connection to the email server and send the message, enabling recipients to view visually enriched emails with embedded images. This approach enhances communication by incorporating visual elements into the HTML content. The code for this will be : 


# import all necessary components

import smtplib

from email.mime.text import MIMEText

from email.mime.image import MIMEImage

from email.mime.multipart import MIMEMultipart

port = 587

smtp_server = "live.smtp.mailtrap.io"

login = "1a2b3c4d5e6f7g" # paste your login generated by Mailtrap

password = "1a2b3c4d5e6f7g" # paste your password generated by Mailtrap

sender_email = "[email protected]"

receiver_email = "[email protected]"

message = MIMEMultipart("alternative")

message["Subject"] = "CID image test"

message["From"] = sender_email

message["To"] = receiver_email


<html>

<body>

<img src="cid:Mailtrapimage">

</body>

</html>


part = MIMEText(html, "html")

message.attach(part)

# We assume that the image file is in the same directory that you run your Python script from

fp = open('mailtrap.jpg', 'rb')

image = MIMEImage(fp.read())

fp.close()

# Specify the ID according to the img src in the HTML part

image.add_header('Content-ID', '<Mailtrapimage>')

message.attach(image)

# send your email

with smtplib.SMTP("live.smtp.mailtrap.io", 587) as server:

server.login(login, password)

server.sendmail(

sender_email, receiver_email, message.as_string()

)

print('Sent')

We must remember that the image we have embedded is in binary reading mode, and it is attached to the email, which the receiver can view.

HTML Email Pre-Send Testing: Importance and Process

Ensuring flawless email delivery requires thorough HTML email pre-send testing. Furthermore, this enhances the reliability and appearance of the HTML Email to the recipients. Let us look in detail at the process’s significance and rundown. 

react render html string

Significance of Email Testing

  • Email Testing refers to testing a mail for formatting, layout, and display.
  • Pre-send testing when sending HTML content with Python is a sure way to ensure your mailing list’s accuracy and email communications’ deliverability.
  • Additionally, you can check for the display of your email on all compatible devices and prevent it from ending up in the spam. 

Mailtrap Email Testing

  • Mailtrap is a vital tool that can be used for email testing.
  • It offers a secure environment wherein you can test and debug your emails before they reach the recipients.
  • With its simulated SMTP server, Mailtrap allows you to ensure your emails are accurately rendered.
  • Additionally, Mailtrap can flag potential issues, enhancing the overall email delivery process.  

Methods to test with Mailtrap Email Testing

Mailtrap simplifies email testing with various methods. For one, you could use the Mailtrap inbox to simulate email sending without reaching recipients. Secondly, the spam testing feature can flag potential issues that might lead to an email being marked as spam. Lastly, APIs could be seamlessly used for automating email testing. Let us look at the SMTP and the API Methods under Mailtrap Email Testing. 

SMTP Method

The SMTP Method for Mailtrap Email Testing involves simulating email sending through the Simple Mail Transfer Protocol. Additionally, by using the SMTP server on the Mailtrap Server, you can test the functioning of your email without sending it to the recipients. With the SMTP Method, developers can identify infrastructural challenges in a controlled environment.

smtp

To achieve this, follow these steps:

  • First, go to Mailtrap and select email testing. Furthermore, create an inbox for testing. 
  • Afterward, choose the Python smtplib from the integrations section and test your mail in real-time.

API Method

API or Application Programming Interface serves the purpose of integrating new applications in pre-existing softwares. Leveraging Mailtrap’s API method will streamline the programmatic control of test emails. Additionally, sending and testing emails can be automated directly from the developer’s application.

api

Due to its seamless workflow, the API method is a powerful tool for comprehensive email testing. For testing, follow these steps:

  • First, go to API tokens from the Mailtrap settings.
  • Now, you have to send HTTP requests. You can write Api-Token: {api_token}, where {api_token} is your API token. 

Hence, you are all set to test emails with the API method.

FAQs 

Can Python send automatic emails?

Yes, you can send automatic emails via Python. The most common library in Python to use for this is the 'smtplib'.

Can I send email from Python without SMTP?

Yes, you can send emails from Python without using SMTP. One such method is to use external email services or APIs.

How to send HTML email using Python?

For sending HTML email using Python, you can use the 'smtplib' library in combination with the 'email.mime.text.' module to create and send HTML-formatted content.

How do you send an output to an email in Python?

To send the output of a Python script or program via email, you can capture the output and then include it in the email body.

Conclusion

To conclude, when sending HTML Emails with Python, you can rely on SMTP or Transactional Email Services. Both methods are reliable, and the purpose and demands of email communication can determine the choice.

Additionally, once your mail is ready, ensure you conduct pre-send testing via the SMTP and API methods. This is especially important when sending the HTML email containing attachments or images.

Moreover, there’s a lot you can do with HTML as it is a widely used language, and you should learn how to connect HTML forms to MySQL databases using PHP and how to add HTML code to Wix to know more about HTML and its compatibility. 

Leave a Reply