批量电子邮件发件人的标题“收件人:”[重复]
Posted
技术标签:
【中文标题】批量电子邮件发件人的标题“收件人:”[重复]【英文标题】:Header "To:" for a Bulk Email Sender [duplicate] 【发布时间】:2019-06-22 01:22:47 【问题描述】:我正在尝试编写一个 python 代码来向已注册列表的人发送一些时事通讯。 我的问题是标题“To:”部分!我无法将电子邮件作为“收件人:”地址放入列表中,当收件人打开电子邮件时,他们看不到“收件人:”标题中的电子邮件地址。这是我正在谈论的截图:http://tinypic.com/r/zlr7sl/9
我不是程序员,我只是想学习一些新东西。我的英语并不完美。我希望你能理解我。
from smtplib import SMTP
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
host = 'smtp.server.com'
port = 587
usr = 'USERNAME'
pwd = 'PASSWORD'
from_email = 'SENDER)EMAIL'
my_list = open('slist.txt', 'r')
msg = MIMEMultipart('alternative')
msg['Subject'] = 'Subject'
msg['From'] = from_email
msg['To'] = '' # <<<<<I want to put emails in slist.txt in this header one by one while sending the emails.
msg.add_header('reply-to','reply-to')
plain_text = 'Testing Message'
html_text = '''\
>>> HTML CODE<<
'''
part1 = MIMEText(plain_text, 'plain')
part2 = MIMEText(html_text, 'html')
msg.attach(part1)
msg.attach(part2)
server = SMTP(host, port)
server.ehlo()
server.starttls()
server.login(usr, pwd)
try:
for emails in my_list:
server.sendmail(from_email, emails, msg.as_string())
print('!!!YEAHH!!!')
except:
print('***OPS***')
server.close()
【问题讨论】:
我已经尝试过 msg['To'] = ' '.join(my_list)。使用此选项,我没有收到任何错误,但没有发送电子邮件slist.txt
中有什么内容? my_list
的值是多少? emails
应该是电子邮件列表。
这部分代码可以解决我的问题,谢谢,我在你分享的链接上找到了。 my_list = open('slist.txt', 'r').readlines() 对于 my_list 中的行: emails = rows.rstrip() to = emails msg['To'] = Header(to, 'utf-8')
【参考方案1】:
只要正确传达了信封收件人,您在 To:
标头中输入的内容并不重要。
邮件列表使用的一个常见技巧是将邮件列表本身放在 To: 标题中:
From: mailing-list@example.edu
To: mailing-list@example.edu
Bcc: actual@example.net, recipients@example.org,
here@example.com, ...
如果您将其传递给sendmail -t
,您将收到虚假To:
地址的退回(或邮件循环,如果列表最终发送给自己,然后将传入的消息重新发送到整个列表等) 但sendmail
在完全忽略标题的模式下接受收件人列表。你可以在文件email.txt
:
From: me@example.org
To: fred@example.net
Subject: Secret stuff
xyzzy
现在,如果您发送sendmail you@example.com <email.txt
,消息将发送给您(仅发送给您,而不发送给 Fred)。
把它想象成信封里的一张纸。如果信封里的纸上写着“圣诞老人,北极”作为收件人,但你把它放在一个写给“总统先生,宾夕法尼亚大道 1600 号”的信封里,不管上面写什么,邮件都会送到白宫密封信封内的纸张。
所以就 Python 代码而言,您可以这样做
msg['Subject'] = 'Subject'
msg['From'] = from_email
msg['To'] = 'noreply@example.org'
# ...
server = SMTP(host, port)
server.ehlo()
server.starttls()
server.login(usr, pwd)
try:
server.sendmail(from_email, my_list, msg.as_string())
无论To:
标头中的值如何,邮件都会发送到my_list
上的收件人。
另一方面,如果您希望为每个收件人发送带有单独 To:
标头的单独消息,您还需要在循环中修改 To:
标头。
msg['Subject'] = 'Subject'
msg['From'] = from_email
msg['To'] = 'noreply@example.org'
# ...
server = SMTP(host, port)
server.ehlo()
server.starttls()
server.login(usr, pwd)
for user in my_list do:
try:
msg['To'] = user
server.sendmail(from_email, [user], msg.as_string())
except:
raise HorrorError('Really, you want to raise an exception here')
但是,您应该了解,如果您在同一个域中有多个收件人,他们的电子邮件服务器将被几乎相同的邮件淹没,这些邮件仅在 To:
标头上有所不同。您可以侥幸逃脱,尤其是在每个域中的收件人数量很少的情况下,但某些邮件管理员肯定会认为这是滥用行为,并且/或者可能会触发自动垃圾邮件过滤器。
切线,我在except:
处理程序中添加了一个raise
,因为您真的不应该使用除处理程序之外的毯子。至少,您应该捕获错误并打印出关于究竟是什么失败的详细信息;否则,您可能会向自己隐藏越来越多的错误。
【讨论】:
感谢您的帮助,是的,您的代码有效,但我的问题是 To 标头。当接收者打开电子邮件时,我希望他在标头中看到他的电子邮件地址:我不希望他看到 noreply@example.org 的空标头。 然后您必须遍历邮件并修改每个收件人的To:
标头。但是,这是非常低效的,因为它强制每个收件人发送一条消息。如果消息在其他方面相同,则可能会被接收许多相同消息的域管理员视为滥用。 (如果您将Bcc:
用于收件人列表,它将显示为包含许多本地收件人的单个消息。)
你能帮我完成这部分吗:循环消息并修改每个收件人的 To: 标题 // 正如我在问题中所解释的那样,我不是程序员,我正在尝试学习新知识。
我昨天已经更新了这个答案来展示如何做到这一点。以上是关于批量电子邮件发件人的标题“收件人:”[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Mailkit 或 mimekit 向多个收件人发送一封电子邮件