批量电子邮件发件人的标题“收件人:”[重复]

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 &lt;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: 标题 // 正如我在问题中所解释的那样,我不是程序员,我正在尝试学习新知识。 我昨天已经更新了这个答案来展示如何做到这一点。

以上是关于批量电子邮件发件人的标题“收件人:”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

抄送收件人的 Mandrill 合并变量不起作用

邮件重复数据删除多个用户

使用 Mailkit 或 mimekit 向多个收件人发送一封电子邮件

如何向 2 个收件人发送电子邮件并且两个收件人在收件人字段中看到对方?

不要向收件人发送电子邮件

从共享表(ios)设置电子邮件发件人和收件人