add excel file attachment when sending python email

attachment, document, email, python

Solution

This is the code that worked for me- to send an email with an attachment in python

#!/usr/bin/python
import smtplib,ssl
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import formatdate
from email import encoders

def send_mail(send_from,send_to,subject,text,files,server,port,username='',password='',isTls=True):
    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = send_to
    msg['Date'] = formatdate(localtime = True)
    msg['Subject'] = subject
    msg.attach(MIMEText(text))

    part = MIMEBase('application', "octet-stream")
    part.set_payload(open("WorkBook3.xlsx", "rb").read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', 'attachment; filename="WorkBook3.xlsx"')
    msg.attach(part)

    #context = ssl.SSLContext(ssl.PROTOCOL_SSLv3)
    #SSL connection only working on Python 3+
    smtp = smtplib.SMTP(server, port)
    if isTls:
        smtp.starttls()
    smtp.login(username,password)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.quit()

Problem

How do i add a document attachment when sending an email with python ? i get the email to send (please ignore: i am looping the email to send every 5 seconds, only for testing purposes, i want it to send every 30 min, just have to change 5 to 1800) here is my code so far. how do i attach a document from my computer? ``` #!/usr/bin/python import time import smtplib while True: TO = 'xxxx@gmail.com' SUBJECT = 'Python Email' TEXT = 'Here is the message' gmail_sender = 'xxxx@gmail.com' gmail_passwd = 'xxxx' server = smtplib.SMTP('smtp.gmail.com',587) server.ehlo() server.starttls() server.ehlo() server.login(gmail_sender, gmail_passwd) BODY = '\n'.join([ 'To: %s' % TO, 'From: %s' % gmail_sender, 'Subject:%s' % SUBJECT, '', TEXT ]) try: server.sendmail(gmail_sender,[TO], BODY) print 'email sent' except: print 'error sending mail' time.sleep(5) server.quit() ```

Original source

Related problems