I am having problems understanding how to email an attachment using Python. I have successfully emailed simple messages with the smtplib. Could someone please explain how to send an attachment in an email. I know there are other posts online but as a Python beginner I find them hard to understand.

2

18 Answers

Here's another:

import smtplib from os.path import basename from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.utils import COMMASPACE, formatdate def send_mail(send_from, send_to, subject, text, files=None, server="127.0.0.1"): assert isinstance(send_to, list) msg = MIMEMultipart() msg['From'] = send_from msg['To'] = COMMASPACE.join(send_to) msg['Date'] = formatdate(localtime=True) msg['Subject'] = subject msg.attach(MIMEText(text)) for f in files or []: with open(f, "rb") as fil: part = MIMEApplication( fil.read(), Name=basename(f) ) # After the file is closed part['Content-Disposition'] = 'attachment; filename="%s"' % basename(f) msg.attach(part) smtp = smtplib.SMTP(server) smtp.sendmail(send_from, send_to, msg.as_string()) smtp.close() 

It's much the same as the first example... But it should be easier to drop in.

25

Here is the modified version from Oli for python 3

import smtplib from pathlib import Path from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email.mime.text import MIMEText from email.utils import COMMASPACE, formatdate from email import encoders def send_mail(send_from, send_to, subject, message, files=[], server="localhost", port=587, username='', password='', use_tls=True): """Compose and send email with provided info and attachments. Args: send_from (str): from name send_to (list[str]): to name(s) subject (str): message title message (str): message body files (list[str]): list of file paths to be attached to email server (str): mail server host name port (int): port number username (str): server auth username password (str): server auth password use_tls (bool): use TLS mode """ msg = MIMEMultipart() msg['From'] = send_from msg['To'] = COMMASPACE.join(send_to) msg['Date'] = formatdate(localtime=True) msg['Subject'] = subject msg.attach(MIMEText(message)) for path in files: part = MIMEBase('application', "octet-stream") with open(path, 'rb') as file: part.set_payload(file.read()) encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename={}'.format(Path(path).name)) msg.attach(part) smtp = smtplib.SMTP(server, port) if use_tls: smtp.starttls() smtp.login(username, password) smtp.sendmail(send_from, send_to, msg.as_string()) smtp.quit() 
12

This is the code I ended up using:

import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email import Encoders SUBJECT = "Email Data" msg = MIMEMultipart() msg['Subject'] = SUBJECT msg['From'] = self.EMAIL_FROM msg['To'] = ', '.join(self.EMAIL_TO) part = MIMEBase('application', "octet-stream") part.set_payload(open("text.txt", "rb").read()) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="text.txt"') msg.attach(part) server = smtplib.SMTP(self.EMAIL_SERVER) server.sendmail(self.EMAIL_FROM, self.EMAIL_TO, msg.as_string()) 

Code is much the same as Oli's post.

Code based from Binary file email attachment problem post.

3
from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.MIMEImage import MIMEImage import smtplib msg = MIMEMultipart() msg.attach(MIMEText(file("text.txt").read())) msg.attach(MIMEImage(file("image.png").read())) # to send mailer = smtplib.SMTP() mailer.connect() mailer.sendmail(from_, to, msg.as_string()) mailer.close() 

Adapted from here.

8

Another way with python 3 (If someone is searching):

import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders fromaddr = "sender mail address" toaddr = "receiver mail address" msg = MIMEMultipart() msg['From'] = fromaddr msg['To'] = toaddr msg['Subject'] = "SUBJECT OF THE EMAIL" body = "TEXT YOU WANT TO SEND" msg.attach(MIMEText(body, 'plain')) filename = "fileName" attachment = open("path of file", "rb") part = MIMEBase('application', 'octet-stream') part.set_payload((attachment).read()) encoders.encode_base64(part) part.add_header('Content-Disposition', "attachment; filename= %s" % filename) msg.attach(part) server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(fromaddr, "sender mail password") text = msg.as_string() server.sendmail(fromaddr, toaddr, text) server.quit() 

Make sure to allow “less secure apps” on your Gmail account

0

Gmail version, working with Python 3.6 (note that you will need to change your Gmail settings to be able to send email via smtp from it:

import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication from os.path import basename def send_mail(send_from: str, subject: str, text: str, send_to: list, files= None): send_to= default_address if not send_to else send_to msg = MIMEMultipart() msg['From'] = send_from msg['To'] = ', '.join(send_to) msg['Subject'] = subject msg.attach(MIMEText(text)) for f in files or []: with open(f, "rb") as fil: ext = f.split('.')[-1:] attachedfile = MIMEApplication(fil.read(), _subtype = ext) attachedfile.add_header( 'content-disposition', 'attachment', filename=basename(f) ) msg.attach(attachedfile) smtp = smtplib.SMTP(host="smtp.gmail.com", port= 587) smtp.starttls() smtp.login(username,password) smtp.sendmail(send_from, send_to, msg.as_string()) smtp.close() 

Usage:

username = '' password = 'top-secret' default_address = [''] send_mail(send_from= username, subject="test", text="text", send_to= None, files= # pass a list with the full filepaths here... ) 

To use with any other email provider, just change the smtp configurations.

The simplest code I could get to is:

#for attachment email from django.core.mail import EmailMessage def attachment_email(request): email = EmailMessage( 'Hello', #subject 'Body goes here', #body '', #from [''], #to [''], #bcc reply_to=[''], headers={'Message-ID': 'foo'}, ) email.attach_file('/my/path/file') email.send() 

It was based on the official Django documentation

5

Other answers are excellent, though I still wanted to share a different approach in case someone is looking for alternatives.

Main difference here is that using this approach you can use HTML/CSS to format your message, so you can get creative and give some styling to your email. Though you aren't enforced to use HTML, you can also still use only plain text.

Notice that this function accepts sending the email to multiple recipients and also allows to attach multiple files.

I've only tried this on Python 2, but I think it should work fine on 3 as well:

import os.path import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication def send_email(subject, message, from_email, to_email=[], attachment=[]): """ :param subject: email subject :param message: Body content of the email (string), can be HTML/CSS or plain text :param from_email: Email address from where the email is sent :param to_email: List of email recipients, example: ["", ""] :param attachment: List of attachments, exmaple: ["file1.txt", "file2.txt"] """ msg = MIMEMultipart() msg['Subject'] = subject msg['From'] = from_email msg['To'] = ", ".join(to_email) msg.attach(MIMEText(message, 'html')) for f in attachment: with open(f, 'rb') as a_file: basename = os.path.basename(f) part = MIMEApplication(a_file.read(), Name=basename) part['Content-Disposition'] = 'attachment; filename="%s"' % basename msg.attach(part) email = smtplib.SMTP('your-smtp-host-name.com') email.sendmail(from_email, to_email, msg.as_string()) 

I hope this helps! :-)

from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import smtplib import mimetypes import email.mime.application smtp_ssl_host = 'smtp.gmail.com' # smtp.mail.yahoo.com smtp_ssl_port = 465 s = smtplib.SMTP_SSL(smtp_ssl_host, smtp_ssl_port) s.login(email_user, email_pass) msg = MIMEMultipart() msg['Subject'] = 'I have a picture' msg['From'] = email_user msg['To'] = email_user txt = MIMEText('I just bought a new camera.') msg.attach(txt) filename = 'introduction-to-algorithms-3rd-edition-sep-2010.pdf' #path to file fo=open(filename,'rb') attach = email.mime.application.MIMEApplication(fo.read(),_subtype="pdf") fo.close() attach.add_header('Content-Disposition','attachment',filename=filename) msg.attach(attach) s.send_message(msg) s.quit() 

For explanation, you can use this link it explains properly

0
from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage from email.mime.text import MIMEText import smtplib msg = MIMEMultipart() password = "password" msg['From'] = "from_address" msg['To'] = "to_address" msg['Subject'] = "Attached Photo" msg.attach(MIMEImage(file("abc.jpg").read())) file = "file path" fp = open(file, 'rb') img = MIMEImage(fp.read()) fp.close() msg.attach(img) server = smtplib.SMTP('smtp.gmail.com: 587') server.starttls() server.login(msg['From'], password) server.sendmail(msg['From'], msg['To'], msg.as_string()) server.quit() 
1

I know this is an old question but I thought there must be an easier way of doing this than the other examples, thus I made a library that solves this cleanly without polluting your codebase. Including attachments is super easy:

from redmail import EmailSender from pathlib import Path # Configure an email sender email = EmailSender( host="<SMTP HOST>", port=0, user_name="", password="<PASSWORD>" ) # Send an email email.send( sender="", receivers=[""], subject="An example email" attachments={ "myfile.txt": Path("path/to/a_file.txt"), "myfile.html": "<h1>Content of a HTML attachment</h1>" } ) 

You may also directly attach bytes, a Pandas DataFrame (which is converted to format depending on file extension in the key), a Matplotlib Figure or a Pillow Image. The library is most likely all the features you need for an email sender (has a lot more than attachments).

To install:

pip install redmail 

Use it any way you like. I also wrote extensive documentation:

4

Because there are many answers here for Python 3, but none which show how to use the overhauled email library from Python 3.6, here is a quick copy+paste from the current email examples documentation. (I have abridged it somewhat to remove frills like guessing the correct MIME type.)

Modern code which targets Python >3.5 should no longer use the email.message.Message API (including the various MIMEText, MIMEMultipart, MIMEBase etc classes) or the even older mimetypes mumbo jumbo.

from email.message import EmailMessage import smtplib msg = EmailMessage() msg["Subject"] = "Our family reunion" msg["From"] = "me <>" msg["To"] = "recipient <>" # definitely don't mess with the .preamble msg.set_content("Hello, victim!") with open("path/to/attachment.png", "rb") as fp: msg.add_attachment( fp.read(), maintype="image", subtype="png") # Notice how smtplib now includes a send_message() method with smtplib.SMTP('localhost') as s: s.send_message(msg) 

The modern email.message.EmailMessage API is now quite a bit more versatile and logical than the older version of the library. There are still a few kinks around the presentation in the documentation (it's not obvious how to change the Content-Disposition: of an attachment, for example; and the discussion of the policy module is probably too obscure for most newcomers) and fundamentally, you still need to have some sort of idea of what the MIME structure should look like. Perhaps see What are the "parts" in a multipart email? for a brief introduction.

Using localhost as your SMTP server obviously only works if you actually have an SMTP server running on your local computer. Properly getting email off your system is a fairly complex separate questions. For simple requirements, probably use your existing email account and your provider's email server (search for examples of using port 587 with Google, Yahoo, or whatever you have; what exactly works depends somewhat on the provider; some will only support port 465, or legacy port 25 which is however now by and large impossible to use on public-facing servers because of spam filtering).

2

None of the currently given answers here will work correctly with non-ASCII symbols in filenames with clients like GMail, Outlook 2016, and others that don't support RFC 2231 (e.g., see here). The Python 3 code below is adapted from some other stackoverflow answers (sorry, didn't save the origin links) and odoo/openerp code for Python 2.7 (see ir_mail_server.py). It works correctly with GMail and others, and also uses SSL.

import smtplib, ssl from os.path import basename from email.mime.base import MIMEBase from mimetypes import guess_type from email.encoders import encode_base64 from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.utils import COMMASPACE, formatdate from email.charset import Charset def try_coerce_ascii(string_utf8): """Attempts to decode the given utf8-encoded string as ASCII after coercing it to UTF-8, then return the confirmed 7-bit ASCII string. If the process fails (because the string contains non-ASCII characters) returns ``None``. """ try: string_utf8.encode('ascii') except UnicodeEncodeError: return return string_utf8 def encode_header_param(param_text): """Returns an appropriate RFC 2047 encoded representation of the given header parameter value, suitable for direct assignation as the param value (e.g. via Message.set_param() or Message.add_header()) RFC 2822 assumes that headers contain only 7-bit characters, so we ensure it is the case, using RFC 2047 encoding when needed. :param param_text: unicode or utf-8 encoded string with header value :rtype: string :return: if ``param_text`` represents a plain ASCII string, return the same 7-bit string, otherwise returns an ASCII string containing the RFC2047 encoded text. """ if not param_text: return "" param_text_ascii = try_coerce_ascii(param_text) return param_text_ascii if param_text_ascii\ else Charset('utf8').header_encode(param_text) smtp_server = '<someserver.com>' smtp_port = 465 # Default port for SSL sender_email = '<>' sender_password = '<PASSWORD>' receiver_emails = ['<>', '<>'] subject = 'Test message' message = """\ Hello! This is a test message with attachments. This message is sent from Python.""" files = ['<path1>/файл1.pdf', '<path2>/файл2.png'] # Create a secure SSL context context = ssl.create_default_context() msg = MIMEMultipart() msg['From'] = sender_email msg['To'] = COMMASPACE.join(receiver_emails) msg['Date'] = formatdate(localtime=True) msg['Subject'] = subject msg.attach(MIMEText(message)) for f in files: mimetype, _ = guess_type(f) mimetype = mimetype.split('/', 1) with open(f, "rb") as fil: part = MIMEBase(mimetype[0], mimetype[1]) part.set_payload(fil.read()) encode_base64(part) filename_rfc2047 = encode_header_param(basename(f)) # The default RFC 2231 encoding of Message.add_header() works in Thunderbird but not GMail # so we fix it by using RFC 2047 encoding for the filename instead. part.set_param('name', filename_rfc2047) part.add_header('Content-Disposition', 'attachment', filename=filename_rfc2047) msg.attach(part) with smtplib.SMTP_SSL(smtp_server, smtp_port, context=context) as server: server.login(sender_email, sender_password) server.sendmail(sender_email, receiver_emails, msg.as_string()) 
2

Below is combination of what I've found from SoccerPlayer's post Here and the following link that made it easier for me to attach an xlsx file. Found Here

file = 'File.xlsx' username='' password='' send_from = '' send_to = 'recipient1 , recipient2' Cc = 'recipient' msg = MIMEMultipart() msg['From'] = send_from msg['To'] = send_to msg['Cc'] = Cc msg['Date'] = formatdate(localtime = True) msg['Subject'] = '' server = smtplib.SMTP('smtp.gmail.com') port = '587' fp = open(file, 'rb') part = MIMEBase('application','vnd.ms-excel') part.set_payload(fp.read()) fp.close() encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment', filename='Name File Here') msg.attach(part) smtp = smtplib.SMTP('smtp.gmail.com') smtp.ehlo() smtp.starttls() smtp.login(username,password) smtp.sendmail(send_from, send_to.split(',') + msg['Cc'].split(','), msg.as_string()) smtp.quit() 

With my code you can send email attachments using gmail you will need to:

set your gmail address at "YOUR SMTP EMAIL HERE"

set your gmail account password at "YOUR SMTP PASSWORD HERE_"

In the ___EMAIL TO RECEIVE THE MESSAGE_ part you need to set the destination email address.

Alarm notification is the subject,

Someone has entered the room, picture attached is the body

["/home/pi/webcam.jpg"] is an image attachment.

#!/usr/bin/env python import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email.MIMEText import MIMEText from email.Utils import COMMASPACE, formatdate from email import Encoders import os USERNAME = "___YOUR SMTP EMAIL HERE___" PASSWORD = "__YOUR SMTP PASSWORD HERE___" def sendMail(to, subject, text, files=[]): assert type(to)==list assert type(files)==list msg = MIMEMultipart() msg['From'] = USERNAME msg['To'] = COMMASPACE.join(to) msg['Date'] = formatdate(localtime=True) msg['Subject'] = subject msg.attach( MIMEText(text) ) for file in files: part = MIMEBase('application', "octet-stream") part.set_payload( open(file,"rb").read() ) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file)) msg.attach(part) server = smtplib.SMTP('smtp.gmail.com:587') server.ehlo_or_helo_if_needed() server.starttls() server.ehlo_or_helo_if_needed() server.login(USERNAME,PASSWORD) server.sendmail(USERNAME, to, msg.as_string()) server.quit() sendMail( ["___EMAIL TO RECEIVE THE MESSAGE__"], "Alarm notification", "Someone has entered the room, picture attached", ["/home/pi/webcam.jpg"] ) 
1

You can also specify the type of attachment you want in your e-mail, as an example I used pdf:

def send_email_pdf_figs(path_to_pdf, subject, message, destination, password_path=None): ## credits: from socket import gethostname #import email from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import smtplib import json server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() with open(password_path) as f: config = json.load(f) server.login('', config['password']) # Craft message (obj) msg = MIMEMultipart() message = f'{message}\nSend from Hostname: {gethostname()}' msg['Subject'] = subject msg['From'] = '' msg['To'] = destination # Insert the text to the msg going by e-mail msg.attach(MIMEText(message, "plain")) # Attach the pdf to the msg going by e-mail with open(path_to_pdf, "rb") as f: #attach = email.mime.application.MIMEApplication(f.read(),_subtype="pdf") attach = MIMEApplication(f.read(),_subtype="pdf") attach.add_header('Content-Disposition','attachment',filename=str(path_to_pdf)) msg.attach(attach) # send msg server.send_message(msg) 

inspirations/credits to:

Try This i hope this might help

import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders fromaddr = "youremailhere" toaddr = input("Enter The Email Adress You want to send to: ") # instance of MIMEMultipart msg = MIMEMultipart() # storing the senders email address msg['From'] = fromaddr # storing the receivers email address msg['To'] = toaddr # storing the subject msg['Subject'] = input("What is the Subject:\t") # string to store the body of the mail body = input("What is the body:\t") # attach the body with the msg instance msg.attach(MIMEText(body, 'plain')) # open the file to be sent filename = input("filename:") attachment = open(filename, "rb") # instance of MIMEBase and named as p p = MIMEBase('application', 'octet-stream') # To change the payload into encoded form p.set_payload((attachment).read()) # encode into base64 encoders.encode_base64(p) p.add_header('Content-Disposition', "attachment; filename= %s" % filename) # attach the instance 'p' to instance 'msg' msg.attach(p) # creates SMTP session s = smtplib.SMTP('smtp.gmail.com', 587) # start TLS for security s.starttls() # Authentication s.login(fromaddr, "yourpaswordhere) # Converts the Multipart msg into a string text = msg.as_string() # sending the mail s.sendmail(fromaddr, toaddr, text) # terminating the session s.quit() 
0

Had a bit of a hussle in getting my script to send generic attachments but after a bit of work doing research and skimming through articles on this post, I finally came up with the following

# to query: import sys import ast from datetime import datetime import smtplib import mimetypes from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart from email import encoders from email.message import Message from email.mime.audio import MIMEAudio from email.mime.base import MIMEBase from email.mime.image import MIMEImage from email.mime.text import MIMEText from dotenv import load_dotenv, dotenv_values load_dotenv() # load environment variables from .env ''' sample .env file # .env file SECRET_KEY="gnhfpsjxxxxxxxx" DOMAIN="GMAIL" TOP_LEVEL_DOMAIN="COM" EMAIL="CHESERExxxxxx@${DOMAIN}.${TOP_LEVEL_DOMAIN}" TO_ADDRESS = ("","")#didn't use this in the code but you can load recipients from here ''' import smtplib tls_port = 587 ssl_port = 465 smtp_server_domain_names = {'GMAIL': ('smtp.gmail.com', tls_port, ssl_port), 'OUTLOOK': ('smtp-mail.outlook.com', tls_port, ssl_port), 'YAHOO': ('smtp.mail.yahoo.com', tls_port, ssl_port), 'AT&T': ('smtp.mail.att.net', tls_port, ssl_port), } # todo: Ability to choose mail server provider # auto read in from the dictionary the respective mail server address and the tls and ssl ports class Bimail: def __init__(self, subject, recipients): self.subject = subject self.recipients = recipients self.htmlbody = '' self.mail_username = 'will be loaded from .env file' self.mail_password = 'loaded from .env file as well' self.attachments = [] # Creating an smtp object # todo: if gmail passed in use gmail's dictionary values def setup_mail_client(self, domain_key_to_use="GMAIL", email_servers_domains_dict=smtp_server_domain_names): """ :param report_pdf: :type to_address: str """ smtpObj = None encryption_status = True config = dotenv_values(".env") # check if the domain_key exists from within the available email-servers-domains dict file passed in # else throw an error # read environment file to get the Domain to be used if f"{domain_key_to_use}" in email_servers_domains_dict.keys(): # if the key is found do the following # 1.extract the domain,tls,ssl ports from email_servers dict for use in program try: values_tuple = email_servers_domains_dict.get(f"{domain_key_to_use}") ssl_port = values_tuple[2] tls_port = values_tuple[1] smtp_server = values_tuple[0] smtpObj = smtplib.SMTP(smtp_server, tls_port) print(f"Success connect with tls on {tls_port}") print('Awaiting for connection encryption via startttls()') encryption_status = False except: print(f"Failed connection via tls on port {tls_port}") try: smtpObj = smtplib.SMTP_SSL(smtp_server, ssl_port) print(f"Success connect with ssl on {ssl_port}") encryption_status = True except: print(f"Failed connection via ssl on port {ssl_port}") finally: print("Within Finally block") if not smtpObj: print("Failed!!! no Internet connection") else: # if connection channel is unencrypted via the use of tls encrypt it if not encryption_status: status = smtpObj.starttls() if status[0] == 220: print("Successfully Encrypted tls channel") print("Successfully Connected!!!! Requesting Login") # Loading .env file values to config variable #load Login Creds from ENV File self.mail_username = f'{config.get("EMAIL")}' self.mail_password = f'{cofig.get("SECRET_KEY")}' status = smtpObj.login(self.mail_usernam,self.mail_password) if status[0] == 235: print("Successfully Authenticated User to xxx account") success = self.send(smtpObj, f'{config.get("EMAIL")}') if not bool(success): print(f"Success in Sending Mail to {success}") print("Disconnecting from Server INstance") quit_result = smtpObj.quit() else: print(f"Failed to Post {success}!!!") print(f"Quiting anyway !!!") quit_result = smtpObj.quit() else: print("Application Specific Password is Required") else: print("World") def send(self,smtpObj,from_address): msg = MIMEMultipart('alternative') msg['From'] = from_address msg['Subject'] = self.subject msg['To'] = ", ".join(self.recipients) # to must be array of the form [''] msg.preamble = "preamble goes here" # check if there are attachments if yes, add them if self.attachments: self.attach(msg) # add html body after attachments msg.attach(MIMEText(self.htmlbody, 'html')) # send print(f"Attempting Email send to the following addresses {self.recipients}") result = smtpObj.sendmail(from_address, self.recipients,msg.as_string()) return result def htmladd(self, html): self.htmlbody = self.htmlbody + '<p></p>' + html def attach(self, msg): for f in self.attachments: ctype, encoding = mimetypes.guess_type(f) if ctype is None or encoding is not None: ctype = "application/octet-stream" maintype, subtype = ctype.split("/", 1) if maintype == "text": fp = open(f) # Note: we should handle calculating the charset attachment = MIMEText(fp.read(), _subtype=subtype) fp.close() elif maintype == "image": fp = open(f, "rb") attachment = MIMEImage(fp.read(), _subtype=subtype) fp.close() elif maintype == "ppt": fp = open(f, "rb") attachment = MIMEApplication(fp.read(), _subtype=subtype) fp.close() elif maintype == "audio": fp = open(f, "rb") attachment = MIMEAudio(fp.read(), _subtype=subtype) fp.close() else: fp = open(f, "rb") attachment = MIMEBase(maintype, subtype) attachment.set_payload(fp.read()) fp.close() encoders.encode_base64(attachment) attachment.add_header("Content-Disposition", "attachment", filename=f) attachment.add_header('Content-ID', '<{}>'.format(f)) msg.attach(attachment) def addattach(self, files): self.attachments = self.attachments + files # example below if __name__ == '__main__': # subject and recipients mymail = Bimail('Sales email ' + datetime.now().strftime('%Y/%m/%d'), ['', '']) # start html body. Here we add a greeting. mymail.htmladd('Good morning, find the daily summary below.') # Further things added to body are separated by a paragraph, so you do not need to worry about newlines for new sentences # here we add a line of text and an html table previously stored in the variable mymail.htmladd('Daily sales') mymail.addattach(['htmlsalestable.xlsx']) # another table name + table mymail.htmladd('Daily bestsellers') mymail.addattach(['htmlbestsellertable.xlsx']) # add image chart title mymail.htmladd('Weekly sales chart') # attach image chart mymail.addattach(['saleschartweekly.png']) # refer to image chart in html mymail.htmladd('<img src="cid:saleschartweekly.png"/>') # attach another file mymail.addattach(['MailSend.py']) # send! mymail.setup_mail_client( domain_key_to_use="GMAIL",email_servers_domains_dict=smtp_server_domain_names) 
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy