我试图写一个非常基本的电子邮件发送脚本。这是我的代码..
import smtplib
from email.message import EmailMessage
msg = EmailMessage()
msg.set_content("Test message.")
msg['Subject'] = "Test Subject!!!"
msg['From'] = "myemail@gmail.com"
email_list = ["xyz@gmail.com", "abc@gmail.com"]
for email in email_list:
msg['To'] = email
server = smtplib.SMTP(host='smtp.gmail.com', port=587)
server.starttls()
server.login("myemail@gmail.com", "mypassword")
server.send_message(msg)
server.quit()
脚本应该发送邮件给多个收件人,所以,我需要改变msg['To']
字段时,通过循环迭代,但我得到了以下错误的追溯波纹管。
Traceback (most recent call last):
File "exp.py", line 66, in <module>
msg['To'] = email
File "/usr/lib/python3.8/email/message.py", line 407, in __setitem__
raise ValueError("There may be at most {} {} headers "
ValueError: There may be at most 1 To headers in a message
我该怎么解决?请帮帮忙。谢谢。
5条答案
按热度按时间g2ieeal71#
清除消息的“收件人”属性。
下面是抛出异常的代码:(\Python 385\资料库\电子邮件\消息. py)
o2rvlv0m2#
由于不知道EmailMessage类的内部工作原理,我可以假设每次调用
__setitem__
都会写入电子邮件消息的头部,因此通过在循环中调用它,头部会被写入多次。我的建议是为要发送的每封电子邮件创建一个电子邮件消息,但只创建一个服务器:仅当您需要单独发送邮件时。如果您想同时向每个人发送相同的邮件,您可以执行以下操作
nvbavucw3#
如果你有一个地址列表,其中一些包含名字/头衔,那么我认为这是正确的方法。请注意,parseaddr + formataddr对可能不需要,但parseaddr可以纠正一些格式错误的收件人。
kr98yfug4#
如果您只是从循环中删除server.quit()并添加del msg [′ to ′],则不会出现错误
atmip9wb5#
把“
server.quit
“换成“def msg['to']
”就是我让它工作的方法!