Sending Attachments as an E-mail using Python

To send an e-mail with mixed content requires to set Content-type header to multipart/mixed. Then, text and attachment sections can be specified within boundaries.

A boundary is started with two hyphens followed by a unique number, which cannot appear in the message part of the e-mail. A final boundary denoting the e-mail's final section must also end with two hyphens.

Attached files should be encoded with the pack("m") function to have base64 encoding before transmission.


Following is the example, which sends a file /tmp/test.txt as an attachment. Try it once −

import smtplib
import base64
filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent =
encodedcontent = base64.b64encode(filecontent) # base64
sender = ''
reciever = ''
body ="""
This is a test email to send an attachement.
# Define the main headers.
part1 = """From: From Person <>
To: To Person <>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
""" % (marker, marker)
# Define the message action
part2 = """Content-Type: text/plain
""" % (body,marker)
# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Disposition: attachment; filename=%s
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, reciever, message)
   print "Successfully sent email"
except Exception:
   print "Error: unable to send email"