python - 如何使用 MIME/SMTP 和电子邮件附加 CSV 文件?

标签 python csv email smtp mime

我正在尝试附加 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 文件并将其命名为相同的文件,然后通过电子邮件发送?

最佳答案

问题似乎与这一行有关:

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

编辑:添加了完整示例

关于python - 如何使用 MIME/SMTP 和电子邮件附加 CSV 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43214684/

相关文章:

Python AST 代码示例取自 Serious Python : Black-Belt Advice on Deployment, 可扩展性、测试等一书

python - 类型错误 : 'filter' object is not subscriptable

python - 使用 PyInstaller 创建 Python 可执行文件后权限被拒绝

php - 为什么使用 php 从一个非常大的 csv 文件中只读取 1000 条记录?

mysql - 删除 csv 文件中最多第 N 个模式匹配实例的文本

C# fileattachment 内容到字符串

python - 神经网络训练验证损失的解释

c# - 如何解析和替换大型 csv 文件中不正确的跨世纪日期值

java - 通过 GMail 从 Glassfish 发送邮件会抛出 java.net.UnknownHostException

c# - 具有特殊字符的 Asp.net C# 电子邮件地址