[Python] How to send email attachments?
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. Thanks all
Code based from Binary file email attachment problem post.
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.
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.
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: ["firstname.lastname@example.org", "email@example.com"] :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! :-)