经过大量的搜索,我无法找到如何使用smtplib。发送邮件到多个收件人。问题是每次发送邮件时,邮件标题似乎包含多个地址,但实际上只有第一个收件人会收到电子邮件。
问题似乎出在邮件上。Message模块期望与smtplb .sendmail()函数不同的内容。
简而言之,要发送给多个收件人,您应该将标题设置为一串以逗号分隔的电子邮件地址。sendmail()参数to_addr应该是一个电子邮件地址列表。
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import smtplib
msg = MIMEMultipart()
msg["Subject"] = "Example"
msg["From"] = "me@example.com"
msg["To"] = "malcom@example.com,reynolds@example.com,firefly@example.com"
msg["Cc"] = "serenity@example.com,inara@example.com"
body = MIMEText("example email body")
msg.attach(body)
smtp = smtplib.SMTP("mailhost.example.com", 25)
smtp.sendmail(msg["From"], msg["To"].split(",") + msg["Cc"].split(","), msg.as_string())
smtp.quit()
尝试声明一个包含所有收件人和cc_收件人的列表变量为字符串,而不是循环遍历它们,如下所示:
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import smtplib
recipients = ["malcom@example.com","reynolds@example.com", "firefly@example.com"]
cc_recipients=["serenity@example.com", "inara@example.com"]
msg = MIMEMultipart()
msg["Subject"] = "Example"
msg["From"] = "me@example.com"
msg["To"] = ', '.join(recipients)
msg["Cc"] = ', '.join(cc_recipients)
body = MIMEText("example email body")
msg.attach(body)
smtp = smtplib.SMTP("mailhost.example.com", 25)
for recipient in recipients:
smtp.sendmail(msg["From"], recipient, msg.as_string())
for cc_recipient in cc_recipients:
smtp.sendmail(msg["From"], cc_recipient, msg.as_string())
smtp.quit()
我提出了这个可导入模块函数。本例中使用的邮件服务器为gmail。它分为头和消息,所以你可以清楚地看到发生了什么:
import smtplib
def send_alert(subject=""):
to = ['email@one.com', 'email2@another_email.com', 'a3rd@email.com']
gmail_user = 'me@gmail.com'
gmail_pwd = 'my_pass'
smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(gmail_user, gmail_pwd)
header = 'To:' + ", ".join(to) + '\n' + 'From: ' + gmail_user + '\n' + 'Subject: ' + subject + '\n'
msg = header + '\n' + subject + '\n\n'
smtpserver.sendmail(gmail_user, to, msg)
smtpserver.close()
你需要了解电子邮件的可见地址和发送地址之间的区别。
msg[“To”]本质上是打印在信件上的内容。它实际上没有任何影响。除了你的电子邮件客户端,就像普通的邮政人员一样,会假设这是你想要发送电子邮件的人。
然而,实际的交付可能会有很大的不同。所以你可以把邮件(或副本)投到完全不同的人的邮箱里。
这有很多原因。例如转发。在转发时,To:报头字段不会改变,但电子邮件会被放入不同的邮箱。
smtp。Sendmail命令现在负责实际的传递。电子邮件。信息只是信件的内容,而不是传递方式。
在低级SMTP中,您需要一个接一个地提供接收者,这就是为什么地址列表(不包括姓名!)是合理的API。
对于标头,它还可以包含例如名称,例如To: First Last <email@addr.tld>, Other User <other@mail.tld>。因此,不建议使用您的代码示例,因为它将无法传递此邮件,因为仅通过拆分它,您仍然没有获得有效地址!
实际上问题在于SMTP。发送邮件和电子邮件。MIMEText需要两个不同的东西。
电子邮件。MIMEText为电子邮件正文设置了“To:”标头。它仅用于向另一端的人显示结果,并且像所有电子邮件标题一样,必须是单个字符串。(请注意,它实际上不必与实际接收消息的人有任何关系。)
SMTP。另一方面,sendmail为SMTP协议设置消息的“信封”。它需要一个Python字符串列表,每个字符串都有一个地址。
所以,你需要做的就是将收到的两个回复结合起来。将msg['To']设置为单个字符串,但将原始列表传递给sendmail:
emails = ['a.com','b.com', 'c.com']
msg['To'] = ', '.join( emails )
....
s.sendmail( msg['From'], emails, msg.as_string())