【问题标题】:How to attach CSV file with MIME/SMTP and email?如何使用 MIME/SMTP 和电子邮件附加 CSV 文件?
【发布时间】:2017-08-30 02:14:56
【问题描述】:

我正在尝试附加一个 CSV 文件并通过电子邮件发送。

目前,我正在执行以下操作,但它只是附加一个空的 CSV 文件,而不是附加我在同一目录中的 CSV 文件:

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'] = 'my_email@yahoo.com'
    msg['To'] = COMMASPACE.join(['recepient_email@gmail.com'])
    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('my_email@yahoo.com', 'myemailpassword')
    smtpObj.sendmail('my_email@yahoo.com', 'recepient_email@gmail.com', msg.as_string())

    smtpObj.quit()

所以我的问题是,我做错了什么?如何将 CSV 文件附加到同一目录和电子邮件中,而不是创建一个空的 CSV 文件并将其命名为相同,然后通过电子邮件发送?

【问题讨论】:

  • 请参阅revisions 了解其他一些字符修复。

标签: python csv email smtp mime


【解决方案1】:

问题。所以我的问题是,我做错了什么?

你的代码对我有用,没有错。

请编辑您的问题并添加以下输出:

def environ():
    import os
    for f in os.listdir('.'):
        print('%s\tuid=%s,\tgid=%s,\tsize=%s' % (f, os.stat(f)[4], os.stat(f)[5], os.stat(f)[6])  )  

确保从相同的*.py 文件和相同的def email_attachment() 运行它

def email_attachment():
    environ()
    #...

【讨论】:

    【解决方案2】:

    问题似乎出在这一行:

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

    它在filename= 之后包含一个非 ASCII 字符“\xe2”。这是旧的ascii encoding 问题,在这种情况下是: vs "

    附带说明,您还可以更改 add_header 参数以匹配此Python docs example

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

    完整的工作示例:

    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 = 'example@yahoo.com'
    MY_PASSWORD = '********************'
    TO_EMAIL = 'example@gmail.com'
    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()
    

    编辑:添加完整示例

    【讨论】:

    • 感谢您的回复!按照建议尝试了它,但仍然没有运气
    • 感谢您的修改并试一试,但它仍然只是附加一个名为attachthisfile.csv 的新CSV 文件,而不是在同一目录中抓取现有的attachthisfile.csv
    • 奇怪!我从 yahoo 到 gmail 对其进行了测试。所有非ASCII反引号和引号都被替换了吗?你在运行 Python 2 还是 3? csv文件的编码是什么?
    • 也许从一个新的 utf-8 测试 csv 开始以排除这种情况? stackoverflow.com/questions/18766955/…
    • 是的,确实如此。运行 Python 2。抱歉,如何确定 csv 文件的编码?
    猜你喜欢
    • 2017-07-15
    • 2015-05-28
    • 2014-08-21
    • 2013-07-22
    • 2017-11-07
    • 2019-05-29
    • 2014-08-30
    • 2015-07-09
    • 2016-12-08
    相关资源
    最近更新 更多