How to send email attachments? How to send email attachments? python python

How to send email attachments?


Here's another:

import smtplibfrom os.path import basenamefrom email.mime.application import MIMEApplicationfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.utils import COMMASPACE, formatdatedef 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.


Here is the modified version from Oli for python 3

import smtplibfrom pathlib import Pathfrom email.mime.multipart import MIMEMultipartfrom email.mime.base import MIMEBasefrom email.mime.text import MIMETextfrom email.utils import COMMASPACE, formatdatefrom email import encodersdef 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()


This is the code I ended up using:

import smtplibfrom email.MIMEMultipart import MIMEMultipartfrom email.MIMEBase import MIMEBasefrom email import EncodersSUBJECT = "Email Data"msg = MIMEMultipart()msg['Subject'] = SUBJECT msg['From'] = self.EMAIL_FROMmsg['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.