通过 Python 电子邮件库发送电子邮件会引发错误“预期的字符串或类似字节的对象”

Posted

技术标签:

【中文标题】通过 Python 电子邮件库发送电子邮件会引发错误“预期的字符串或类似字节的对象”【英文标题】:Sending an email via the Python email library throws error "expected string or bytes-like object" 【发布时间】:2017-05-19 02:32:43 【问题描述】:

我正在尝试通过 python 3.6 中的一个简单函数将 csv 文件作为附件发送。

from email.message import Message
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def email():


    msg = MIMEMultipart()
    msg['Subject'] = 'test'
    msg['From'] = 'test@gmail.com'
    msg['To'] = 'testee@gmail.com'
    msg.preamble = 'preamble'

    with open("test.csv") as fp:
        record = MIMEText(fp.read())
        msg.attach(record)

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.ehlo()
    server.starttls()
    server.login("test@gmail.com", "password")
    server.sendmail("test@gmail.com", "testee@gmail.com", msg)
    server.quit()

调用email() 会产生错误expected string or bytes-like object。将 server.sendmail("test@gmail.com", "testee@gmail.com", msg) 重新定义为 server.sendmail("atest@gmail.com", "testee@gmail.com", msg.as_string()) 会导致发送电子邮件,但会在电子邮件正文中发送 csv 文件,而不是作为附件发送。谁能给我一些关于如何将 csv 文件作为附件发送的指示?

【问题讨论】:

您是否尝试在附件中添加Content-Disposition 标头? msg.add_header('Content-Disposition', 'attachment', filename='test.csv') 这是复制/粘贴错误,还是您实际上错过了msg['From'] = 'test@gmail.com 上的' 也许this是你需要的? @Andrew_CS,复制粘贴错误。谢谢你抓住它!我尝试添加该标头,但遇到了同样的问题 - 电子邮件已成功发送,但在电子邮件正文中以纯文本形式发送。 prntscr.com/drhazy 可能重复:***.com/questions/3362600/… 【参考方案1】:

1) 如果您调用smtplib.SMTP.sendmail(),您应该使用msg.as_string()。或者,如果你有 Python 3.2 或更新版本,你可以使用server.send_message(msg)

2) 您应该在消息中添加正文。按照设计,没有人会看到序言。

3) 您应该使用content-disposition: attachment 来指明哪些部分是附件,哪些部分是内联的。

试试这个:

def email():


    msg = MIMEMultipart()
    msg['Subject'] = 'test'
    msg['From'] = 'XXX'
    msg['To'] = 'XXX'
    msg.preamble = 'preamble'

    body = MIMEText("This is the body of the message")
    msg.attach(body)

    with open("test.csv") as fp:
        record = MIMEText(fp.read())
        record['Content-Disposition'] = 'attachment; filename="test.csv"'
        msg.attach(record)

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.ehlo()
    server.starttls()
    server.login("XXX", "XXX")
    server.sendmail("XXX", "XXX", msg.as_string())
    server.quit()

【讨论】:

这很完美!太感谢了。我尝试了一个文件头,但我错误地附加了它。 那么,你知道用这个发送 html 的方法吗?

以上是关于通过 Python 电子邮件库发送电子邮件会引发错误“预期的字符串或类似字节的对象”的主要内容,如果未能解决你的问题,请参考以下文章

python3 发邮件 smtplib & email 库

从 python 通过 sendmail 发送邮件

使用 python 3.7.3 发送带附件的电子邮件

Linux之python发送邮件

Python SMTP库空白电子邮件随着时间的推移

Flask-Mail 队列消息被发送到不同的电子邮件