Python 属性错误:';列表';对象没有属性';编码';发送电子邮件时

Python 属性错误:';列表';对象没有属性';编码';发送电子邮件时,python,email,smtplib,Python,Email,Smtplib,我想有这个代码,我可以有一个csv文件与一行电子邮件旁边的名称行,然后电子邮件列表上的每一封电子邮件,但在消息中的每一个名字。 这是我的密码: import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import csv def nobrackets(current): return str(current).replace('[','').r

我想有这个代码,我可以有一个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/\u policybase.py”,第369行,折叠中 parts.append(h.encode(linesep=self.linesep,maxlinelen=maxlinelen))

AttributeError:“list”对象没有属性“encode”


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

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

此外,发送消息时不必对消息进行字符串化:而是使用

这一准则应该适用于:

打开('Emails.csv','r')作为csv\u文件:
csv\u reader=csv.reader(csv\u文件)
对于csv_读取器中的行:
名称\u var=行[0]
发送电子邮件至第[1]行
msg=MIMEMultipart()
msg['Subject']='what up doc'
message=(f“嘿{noastrick(nobrackets(names_var))}你今天过得怎么样?”)
msg.attach(MIMEText(消息'plain'))
msg['From']='xxxxxxxxx'
msg['To']=发送电子邮件
服务器登录(电子邮件、密码)
服务器。发送消息(消息、电子邮件、发送到电子邮件)
server.quit()

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

此外,发送消息时不必对消息进行字符串化:而是使用

这一准则应该适用于:

打开('Emails.csv','r')作为csv\u文件:
csv\u reader=csv.reader(csv\u文件)
对于csv_读取器中的行:
名称\u var=行[0]
发送电子邮件至第[1]行
msg=MIMEMultipart()
msg['Subject']='what up doc'
message=(f“嘿{noastrick(nobrackets(names_var))}你今天过得怎么样?”)
msg.attach(MIMEText(消息'plain'))
msg['From']='xxxxxxxxx'
msg['To']=发送电子邮件
服务器登录(电子邮件、密码)
服务器。发送消息(消息、电子邮件、发送到电子邮件)
server.quit()

@Snakechermerb的回答基本正确:


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

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

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

@snakecharmerb的回答基本正确:


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

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

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

nobrakets
noastrick
函数看起来很可疑,就像你不理解字符串内容和它的
repr()
表示字符串列表
hello
world
。字符串本身实际上不包含任何单引号(顺便说一下,不是星号,当然也不是“astricks”)或者方括号;这些都是纯粹的表示帮助。不用说,在Python的标准库中编辑文件对初学者来说绝对没有任何意义。nobrakets和noastrick函数看起来很可疑,就像你不理解上下文和一个字符串及其
repr()
,Python的REPL使用它来显示一个明确的可读版本的值。如果您看到
['hello',world']
,它表示一个字符串列表
hello
world
。字符串本身实际上不包含任何单引号(顺便说一句,不是星号,当然也不是“阿斯特里克”)或者方括号;这些都是纯粹的演示辅助工具。不用说,在Python标准库中编辑文件对初学者来说绝对没有任何意义。这修复了错误,谢谢,伙计。唯一的问题是它同时发送给多个人。我有一个有三个名字的csv和我测试它的电子邮件,它被发送到所有3封电子邮件(作为一个组电子邮件),其中的消息是3次使用3个不同名称的消息。我修改了答案,以显示在for循环中初始化的消息对象,因此每次迭代都会得到一个新的消息对象。这修复了错误,谢谢,伙计。唯一的问题是它同时发送给多个人。我有一个csv w