python – How to send email attachments?

python – How to send email attachments?

Heres 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()

Its 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 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()

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 Olis post.

Code based from Binary file email attachment problem post.

Leave a Reply

Your email address will not be published. Required fields are marked *