如何在python fast中向数十万个收件人发送邮件,每个收件人在邮件头中显示为收件人?
我正在寻找用Python发送大量邮件(数十万封)的解决方案。我有一个收件人列表(在一个文件中),我想向所有收件人发送一封邮件。我希望每个收件人在邮件头中显示为收件人,而不是密件抄送或抄送。好吧,我的解决方案是:分别向他们每个人发送邮件,而不是向所有人发送邮件。我做了以下工作:(我使用了smtplib,线程):如何在python fast中向数十万个收件人发送邮件,每个收件人在邮件头中显示为收件人?,python,email,sendmail,smtplib,Python,Email,Sendmail,Smtplib,我正在寻找用Python发送大量邮件(数十万封)的解决方案。我有一个收件人列表(在一个文件中),我想向所有收件人发送一封邮件。我希望每个收件人在邮件头中显示为收件人,而不是密件抄送或抄送。好吧,我的解决方案是:分别向他们每个人发送邮件,而不是向所有人发送邮件。我做了以下工作:(我使用了smtplib,线程): 它工作起来很慢(大约每秒6封邮件)。所以请帮我加快速度。或者建议我做这项工作的其他解决方案。多谢各位 最快的方法是在您的计算机上安装邮件传输代理,并使用/usr/sbin/sendmail
它工作起来很慢(大约每秒6封邮件)。所以请帮我加快速度。或者建议我做这项工作的其他解决方案。多谢各位 最快的方法是在您的计算机上安装邮件传输代理,并使用
/usr/sbin/sendmail
邮件界面将您的所有电子邮件发送给它。大多数合理的邮件服务器每秒可以接受数千封邮件进行传递,并且可以执行一些SMTP管道,以便在单个连接中将邮件发送到目标域上的多个收件人,从而大大减少通信开销并提高邮件吞吐量。(这不会影响用户对电子邮件的看法。)
大多数邮件服务器还可以非常好地处理暂时停机的服务器,这一点非常重要,因为许多站点都使用它来对付垃圾邮件
但是,如果您真的希望通过Python中的网络连接与SMTP服务器联系,那么最好使用一组发送线程,这些线程将从队列中提取地址,创建并发送电子邮件,然后返回队列以获得另一个要服务的地址。您当前的代码为每个邮件传递创建和销毁一个新线程。线程的创建和销毁都需要时间,所有这些开销都是本可以用来处理邮件的时间
此外,线程池将限制活动连接的总数。创建1000个单独但同时连接到单个邮件服务器是没有意义的。在您可以发送任何SMTP通信之前,设置每个会话的服务器需要三倍的延迟才能建立TCP会话。因此,创建十个线程和十个连接,并重用这些连接来发送电子邮件。(即使是十个线程也可能会有点过头——两个或三个线程可能会更好。见鬼,一个线程可能是最好的,不过如果该连接中断(每个连接的邮件限制?),在重新建立连接之前,您将有一段时间不发送任何内容。)
您现在创建的与非常类似——您启动了数百或数千个线程,但可能没有足够的内存将它们同时保存在RAM中。您可能已经引入了足够多的交换,从而大大降低了发送系统的性能,在发送系统中,单个执行线程可能完全适合内存并在不暂停交换的情况下运行。我的建议(也是最简单的建议)是将这项工作卸载给某些第三方,并在代码中调用它们的库
似乎很受欢迎(这是他们的)。他们还提供慷慨的免费计划
是另一种选择(这是他们的选择)。谷歌应该为你提供成千上万的电子邮件。?你是dem…垃圾邮件发送者之一吗?非常感谢!我以前对线程不太清楚。我会尽力深入了解他们。
class SendMail(threading.Thread):
def __init__(self, from, to, subject, message):
self.from = from
self.to = to
self.subject = subject
self.message = message
def run(self):
try:
msg = MIMEMultipart('alternative')
msg['Subject'] = self.subject
msg['From'] = self.from
msg['To'] = self.to
msg.attach(MIMEText(self.message , 'html'))
server = smtplib.SMTP()
server.connect('xxxxx', 25)
server.login('cxxxxx', 'yyyyyy')
server.sendmail(self.from, self.to, msg.as_string())
except:
pass
def sendmail():
f = open('recipients','w')
from = "me@mail.test"
subject = "hello"
message = "Hello Hello"
for line in f.readlines():
t = SendMail(from, line, subject, message)
t.run()
f.close()