在使用smtplib发送邮件时遇到了“'list' object has no attribute 'encode'”报错,问题已解决。
快速解决
smtplib发送邮件时需要填写两次收件人“见下文代码”。
第一个收件人的位置要求传入字符串,第二个收件人的位置支持多种数据类型:“字符串、列表”。
如果你想发送邮件给多个收件人,将这些收件人保存在一个列表中,将这个列表传入到第一个位置就会导致'list' object has no attribute 'encode'。
解决方案就是使用下面示例中的join,将其处理为字符串。你和
import smtplib
from email.mime.text import MIMEText
def send_email(env,emails):
# 发件服务器信息
smtp_server = "smtp.163.com"
smtp_port = 465
smtp_sender = "Account_Me@163.com"
smtp_password = "Password"
# 发件人&收件人
email_sender = ["Account_Me@163.com"]
email_receivers = ["Account_1@163.com","Account_2@163.com"]
# 邮件信息
email_subject = "测试邮件"
email_body = "这是一封测试邮件"
# 邮件头部信息
message = MIMEText(email_body, "plain", "utf-8")
message["From"] = smtp_sender
message["To"] = ",".join(email_receivers) # 这里有收件人
message["Subject"] = email_subject
# 连接服务器发送邮件
try:
server = smtplib.SMTP_SSL(smtp_server, smtp_port)
server.login(smtp_sender, smtp_password)
server.sendmail(smtp_sender, email_receivers, message.as_string()) # 这里也有收件人
server.quit()
except Exception as e:
print(e)
详细信息
一封电子邮件的发送涉及到“两种收件人”。第一种是我们阅读邮件可以看到的收件人,第二种是邮件服务器处理时真正投递的收件人。
在真正与SMTP服务器交互时使用的server.sendmail()中传入的收件人被称为“信封收件人”,这个收件人决定了“服务器会将邮件发送到谁的邮箱里”。
而在邮件头部信息中标识的message["To"]被称为“信内收件人”,这个收件人不涉及到邮件的投递,它可以决定我们最终阅读邮件时显示的收件人。
举例
message["To"] = "Tom"
server.sendmail(receivers = "Mike")
如果我们这样发送邮件,SMTP服务器在处理时会将邮件只投递给Mike。但Mike最终看到此邮件时会疑惑”收件人里怎么只写了个Tom?“