Python SMTP发信报错'list' object has no attribute 'encode'
报错根因
这个报错和你读取收件人列表、传sendmail参数的逻辑没有关系,你打印的三个入参类型都是符合要求的,问题出在你构造的MIMEMultipart邮件对象本身。
从报错追溯栈可以定位到:异常触发在message.as_string()序列化邮件内容的环节,执行到邮件头编码逻辑时,程序拿到的某个邮件头的值是列表(list)类型,但字符串编码方法encode是字符串类型独有的,列表没有这个方法,所以抛出属性错误。
常见触发场景
绝大多数情况是给邮件头赋值时传错了类型:
- 给
To/Cc/Bcc/From/Subject这类标准头赋值时,直接把读取到的邮箱列表整个传了进去,没有转成逗号分隔的字符串 - 添加自定义邮件头时,没有把列表类型的变量转成字符串就直接赋值
快速排查方法
在调用smtp.sendmail之前,加一段遍历邮件头的代码,直接定位出问题的头字段:
# 遍历所有邮件头,找值为list类型的字段 for header_name, header_value in message.items(): print(f"头字段名:{header_name},值类型:{type(header_value)},值:{header_value}")
找到值类型为list的头字段后,把对应值改成字符串格式即可。比如给To头赋值时,多收件人需要用逗号拼接成字符串再传入,不能直接传列表。
注:你当前循环读取txt逐个发信的逻辑是合法的,
sendmail方法支持传入单个邮箱字符串作为收件人参数,这部分不需要修改。
内容的提问来源于stack exchange,提问作者bido whab
相关产品推荐
相关产品推荐

