【问题标题】:AttributeError: 'list' object has no attribute 'encode' when sending an emailAttributeError:“列表”对象在发送电子邮件时没有属性“编码”
【发布时间】:2020-09-22 00:13:46
【问题描述】:

我想要这个代码,我可以在其中有一排电子邮件旁边有一排姓名的 csv 文件,然后通过电子邮件发送列表中的每封电子邮件,但在邮件中包含每个姓名。 这是我的代码:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import csv


def nobrackets(current):
    return str(current).replace('[','').replace(']','')
def noastrick(current):
    return str(current).replace('\'','').replace('\'','')

email = 'xxxxxxxxxx'
password = 'xxxxxxxx'
send_to_email = []
subject = 'Whats up doc' # The subject line
message = ()
names = []
msg = MIMEMultipart()

msg['Subject'] = 'Whats up doc'

 # Attach the message to the MIMEMultipart object


server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
with open('Emails.csv','r') as csv_file:
    csv_reader=csv.reader(csv_file)
    for line in csv_reader:
        names.append(line[0])
        names_var = names
        send_to_email.append(line[1])
        send_to_email_var = send_to_email
        
        message = (f"Hey {noastrick(nobrackets(names_var))} how has your day been?")
        msg.attach(MIMEText(message, 'plain'))
        msg['From'] = 'xxxxxxxxx'

        msg['To'] = send_to_email_var

        server.login(email, password)
        text = msg.as_string() # You now need to convert the MIMEMultipart object to a string to send
        server.sendmail(email, send_to_email_var, text)
        names.clear()
        message = ()
        send_to_email = []
server.quit()

我得到的错误是 File/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/email/_policybase.py",第 369 行,在 _fold part.append(h.encode(linesep=self.linesep, maxlinelen=maxlinelen))

AttributeError: 'list' 对象没有属性 'encode'

我将列表更改为变量的原因是因为我认为这可能会解决我遇到的错误。我对 python 有点陌生,我意识到错误出现在一个名为 _policybase.py 的文件中,它可能就像我安装在计算机上的 python 应用程序中内置的一样,但我不知道如何编辑该文件或修复那个错误。

【问题讨论】:

  • nobracketsnoastrick 函数看起来很可疑,就像你不理解字符串的 contents 和 Python 的 REPL 使用的 repr() 之间的区别显示一个明确的人类可读版本的值。如果您看到['hello', 'world'],它表示字符串helloworld 的列表。字符串本身实际上并不包含任何单引号(顺便说一下,不是星号,当然也不是“astricks”)或方括号;这些纯粹是演示辅助工具。
  • 不用说,绝对没有在 Python 的标准库中编辑文件对初学者有任何意义。

标签: python email smtplib


【解决方案1】:

@snakecharmerb 的这个答案大部分是正确的:

问题在于代码将 msg['to'] 设置为列表而不是字符串。 smtplib.server.sendmail 将接受字符串列表作为其 toaddrs 参数,但电子邮件不接受(如果需要多个 to 地址,请为每个地址调用一次 msg['to'] = address)。

但是,您不需要通过 for 循环将邮件单独发送给每个收件人。相反,只需将列表作为逗号分隔的字符串分配给 msg["To"],如下所示:

msg["To"] = ", ".join(send_to_email_var)

【讨论】:

  • @randomperson 如果您可以将帮助您的答案标记为正确答案,那就太好了。 :)
【解决方案2】:

问题在于代码将msg['to'] 设置为列表而不是字符串。 smtplib.server.sendmail 将接受字符串列表作为其 toaddrs 参数,但电子邮件不接受(如果需要多个地址,请为每个地址调用一次 msg['to'] = address)。

此外,发送消息时不必对消息进行字符串化:改为使用smtplib.server.send_message

这段代码应该可以工作:

with open('Emails.csv','r') as csv_file:
    csv_reader=csv.reader(csv_file)
    for line in csv_reader:
        names_var = line[0]
        send_to_email_var = line[1]

        msg = MIMEMultipart()
        msg['Subject'] = 'Whats up doc'
        message = (f"Hey {noastrick(nobrackets(names_var))} how has your day been?")
        msg.attach(MIMEText(message, 'plain'))
        msg['From'] = 'xxxxxxxxx'

        msg['To'] = send_to_email_var

        server.login(email, password)
        server.send_message(msg, email, send_to_email_var)
server.quit()

【讨论】:

  • 修复了错误,谢谢,伙计。唯一的问题是它同时发送给多个人。我有一个包含三个名称和电子邮件的 csv,我正在测试它,它被发送到所有 3 封电子邮件(作为一个群组电子邮件),里面的消息是 3 次具有 3 个不同名称的消息。
  • 我已经修改了答案以显示在 for 循环中初始化的消息对象,因此每次迭代都会得到一个新的消息对象。
猜你喜欢
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
相关资源
最近更新 更多