How to attach CSV file with MIME/SMTP and email?

10,323

The issue seems to be with this line:

part.add_header('Content-Disposition', 'attachment; filename=“attachthisfile.csv"')

It contains a Non-ASCII character '\xe2' after filename=. It's the old ascii encoding problem, in this case it's: vs "

As a side note, you can also change the add_header arguments to match this Python docs example:

part.add_header('Content-Disposition', 'attachment', filename='attachthisfile.csv')

Full working example:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE
from email import encoders

SUBJECT = 'Subject string'
FILENAME = 'attachthisfile.csv'
FILEPATH = './attachthisfile.csv'
MY_EMAIL = '[email protected]'
MY_PASSWORD = '********************'
TO_EMAIL = '[email protected]'
SMTP_SERVER = 'smtp.mail.yahoo.com'
SMTP_PORT = 587

msg = MIMEMultipart()
msg['From'] = MY_EMAIL
msg['To'] = COMMASPACE.join([TO_EMAIL])
msg['Subject'] = SUBJECT

part = MIMEBase('application', "octet-stream")
part.set_payload(open(FILEPATH, "rb").read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment', filename=FILENAME)  # or
# part.add_header('Content-Disposition', 'attachment; filename="attachthisfile.csv"')
msg.attach(part)

smtpObj = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
smtpObj.ehlo()
smtpObj.starttls()
smtpObj.login(MY_EMAIL, MY_PASSWORD)
smtpObj.sendmail(MY_EMAIL, TO_EMAIL, msg.as_string())
smtpObj.quit()

Edit: Added full example

Share:
10,323
Jo Ko
Author by

Jo Ko

Updated on July 11, 2022

Comments

  • Jo Ko
    Jo Ko almost 2 years

    I’m attempting to attach a CSV file and email it.

    Currently, I am doing the following but it simply attaches an empty CSV file, rather than attaching the CSV file I have in the same directory:

    import smtplib
    
    from email.mime.multipart import MIMEMultipart
    from email.mime.base import MIMEBase
    from email.mime.text import MIMEText
    from email.utils import COMMASPACE
    from email import encoders
    
    
    def email_attachment():
        SUBJECT = 'Subject string'
    
        msg = MIMEMultipart()
        msg['From'] = '[email protected]'
        msg['To'] = COMMASPACE.join(['[email protected]'])
        msg['Subject'] = SUBJECT
    
        part = MIMEBase('application', "octet-stream")
        #    I have a CSV file named `attachthisfile.csv` in the same directory that I'd like to attach and email
        part.set_payload(open("./attachthisfile.csv", "rb").read())
        encoders.encode_base64(part)
    
        part.add_header('Content-Disposition', 'attachment', filename='attachthisfile.csv')
    
        msg.attach(part)
    
        smtpObj = smtplib.SMTP('smtp.mail.yahoo.com', 587)
        smtpObj.ehlo()
        smtpObj.starttls()
        smtpObj.login('[email protected]', 'myemailpassword')
        smtpObj.sendmail('[email protected]', '[email protected]', msg.as_string())
    
        smtpObj.quit()
    

    So my question is, what could I be doing wrong? How can I attach the CSV file in the same directory and email, rather than creating an empty CSV file and naming it the same, and emailing?

  • Jo Ko
    Jo Ko about 7 years
    Appreciate your response! Gave it an attempt as suggested but still no luck
  • Jo Ko
    Jo Ko about 7 years
    Thank you for the revision and gave it a try, but it still just attaches a new CSV file named attachthisfile.csv rather than grabbing the existing attachthisfile.csv in the same directory.
  • brennan
    brennan about 7 years
    Weird! I tested it from yahoo to gmail. Were all the non-ascii backticks and quotes replaced? Are you running Python 2 or 3? What is the encoding of the csv file?
  • brennan
    brennan about 7 years
    Maybe make start with a fresh utf-8 test csv to rule that out? stackoverflow.com/questions/18766955/…
  • Jo Ko
    Jo Ko about 7 years
    Yup sure did. Running Python 2. Sorry but how do I determine the encoding of the csv file?
  • brennan
    brennan about 7 years
    Maybe try this on your python files as well as your csv stackoverflow.com/a/11021413/6085135
  • scharfmn
    scharfmn over 3 years
    If you're stuck in Python 2 and stdlib, this really works for attaching a csv. Thank you.