Header "To:" 对于批量电子邮件发件人

Header "To:" for a Bulk Email Sender

我正在尝试制作一个 python 代码来向已注册列表的人发送一些时事通讯。 我的问题是 Header "To:" 部分!我无法将电子邮件作为 "To:" 地址放入列表中,当收件人打开电子邮件时,他们在 "To:" header 中看不到他们的电子邮件地址。这是我正在谈论的内容的屏幕截图: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()

只要正确传达信封收件人,您在 To: header 中放入什么并不重要。

邮件列表常用的技巧是将邮件列表本身放在收件人中:header:

From: mailing-list@example.edu
To: mailing-list@example.edu
Bcc: actual@example.net, recipients@example.org,
 here@example.com, ...

如果您将此传递给 sendmail -t,您将因伪造的 To: 地址而被退回(或邮件循环,如果列表最终发送给自己,然后重新发送收到的邮件到整个列表等),但 sendmail 以完全忽略 header 的模式接受收件人列表。你可以把它放在一个文件中 email.txt:

From: me@example.org
To: fred@example.net
Subject: Secret stuff

xyzzy

现在,如果您这样做 sendmail you@example.com <email.txt,消息将发送给您(仅发送给 Fred,而不发送给 Fred)。

把它想象成信封里的一张 sheet 纸。如果信封内的纸上写着 "Santa Claus, North Pole" 作为收件人,但您将它放在一个寄往 "Mr. President, 1600 Pennsylvania Avenue" 的信封中,那么无论密封信封内的纸上写的是什么,邮件都会发送到白宫.

所以就 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: header.

中的值如何,邮件都会在 my_list 发送给收件人

另一方面,如果您希望为每个收件人发送带有个人 To: header 的个人消息,则需要修改 To: header也在循环中。

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: header。你可以逃避这个,特别是如果每​​个域中的收件人数量很少,但它肯定被一些邮件管理员视为滥用,and/or 可能会触发自动垃圾邮件过滤器。

切线地,我在 except: 处理程序中放入了一个 raise 因为你 真的 不应该使用除处理程序之外的毯子。至少,您应该捕获错误并打印出有关具体失败原因的详细信息;否则你可能对自己隐藏了越来越多的错误。