Attach a txt file in Python smtplib Attach a txt file in Python smtplib python python

Attach a txt file in Python smtplib


The same way, using msg.attach:

from email.mime.text import MIMETextfilename = "text.txt"f = file(filename)attachment = MIMEText(f.read())attachment.add_header('Content-Disposition', 'attachment', filename=filename)           msg.attach(attachment)


Since Python3.6, I would recommend start using EmailMessage instead of MimeMultipart. Fewer imports, fewer lines, no need to put the recipients both to the message headers and to the SMTP sender function parameter.

import smtplibfrom email.message import EmailMessagemsg = EmailMessage()msg["From"] = FROM_EMAILmsg["Subject"] = "Subject"msg["To"] = TO_EMAILmsg.set_content("This is the message body")msg.add_attachment(open(filename, "r").read(), filename="log_file.txt")s = smtplib.SMTP('smtp.sendgrid.net', 587)s.login(USERNAME, PASSWORD)s.send_message(msg)

Even better is to install library envelope by pip3 install envelope that's aim is to handle many things in a very intuitive manner:

from envelope import Envelopefrom pathlib import PathEnvelope()\    .from_(FROM_EMAIL)\    .subject("Subject")\    .to("to")\    .message("message")\    .attach(Path(filename))\    .smtp("smtp.sendgrid.net", 587, USERNAME, PASSWORD)\    .send()


It works for me

sender = 'spider@fromdomain.com'receivers = 'who'msg = MIMEMultipart()msg['Subject'] = 'subject'msg['From'] = 'spider man'msg['To'] = 'who@gmail.com'file='myfile.xls'msg.attach(MIMEText("Labour"))attachment = MIMEBase('application', 'octet-stream')attachment.set_payload(open(file, 'rb').read())encoders.encode_base64(attachment)attachment.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file))msg.attach(attachment)print('Send email.')conn.sendmail(sender, receivers, msg.as_string())conn.close()