大量电子邮件发件人的标题“收件人:”

时间:2019-01-29 00:23:41

标签: python email html-email bulk

我正在尝试制作python代码,以向订阅了列表的人们发送一些新闻通讯。 我的问题是标题“收件人:”部分!我不能将电子邮件作为“收件人:”地址放入列表中,并且收件人打开电子邮件时,他们在“收件人:”标题中看不到其电子邮件地址。这是我正在谈论的屏幕截图: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()

1 个答案:

答案 0 :(得分:0)

只要正确传达了信封收件人,您在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())

,无论my_list标头中的值如何,邮件都会通过To:发送给收件人。

另一方面,如果要为每个收件人发送带有单独的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('Really, you want to raise an exception here')

但是,您应该理解,如果您在同一域中有多个收件人,则他们的电子邮件服务器将被几乎相同的邮件淹没,而这些邮件仅To:标头不同。您可以避免这种情况,特别是如果每​​个域中的收件人数量很少,但是某些邮件管理员肯定认为它是滥用的。

有切地,我在raise处理程序中放入了except:,因为您真的除了处理程序外,不应该使用毯子。至少,您应该捕获错误并打印出确切原因的详细信息。否则,您可能会隐藏越来越多的错误。