使用 Python 发送电子邮件
Posted
技术标签:
【中文标题】使用 Python 发送电子邮件【英文标题】:Sending emails using Python 【发布时间】:2019-10-18 14:40:06 【问题描述】:我正在为一个可以发送大量电子邮件的项目工作。我目前每 1:06 秒有 100 封电子邮件。我认为它可以在一分钟或更短的时间内完成。你有什么建议吗?
我已经使用过线程/多线程,但当然是“GIL”。 我也完成了多处理。这就是我得到 1:06 秒的地方,然后池化 1:07 秒
def sendMail(z,x,c):
startti=datetime.datetime.now()
server.sendmail(z,x,c)
timenow= datetime.datetime.now()
print (timenow-startti).total_seconds()
def multiprocessing_func(x):
cursor.execute(query)
starttime=datetime.datetime.now()
while True:
result=cursor.fetchone()
if result==None:
break
subject=str(result[1])
sendto=str(result[2])
msg=MIMEMultipart('mixed')
msg['from']=mail_sender
msg['to']=sendto
msg['subject']=subject
part_text=MIMEText(html, 'html')
msg.attach(part_text)
msg.attach(file1)
sendMail(msg['from'],msg['to'],msg.as_string())
endtime=datetime.datetime.now()
print'%s'%(endtime-starttime)
if __name__ == '__main__':
processes=[]
for i in range(1):
p=multiprocessing.Process(target=multiprocessing_func, args=(i,))
processes.append(p)
p.start()
for process in processes:
process.join
【问题讨论】:
因为你是 `for i in range(1):` 你一次启动一个进程。所以它实际上是连续的。尝试更大的数字,例如 ` for i in range(20):` 如果我把它设为 20,它会调用整个表 20 次 您需要重组您的代码,以便 1)multiprocessing_func
只需要一个 to_email 和主题来发送电子邮件 2) 将数据库查询逻辑从 multiprocessing_func
移动到 __main__
。
最好的办法是使用异步IO,这样就不会阻塞网络调用。如果您自己拨打电话,请查看 aiohttp 或 aiosmtpd。如果你正在使用一些模块抽象发送邮件,请尝试找到一个可以进行异步操作的模块。
我只使用 mysql.connector 和多处理模块 hoodakaushal
【参考方案1】:
第 1 步。找出处理的哪个部分花费的时间最多。
是从数据库中获取数据吗? 100 个人SELECTs
可以在 1 秒内通过合适的索引和查询公式完成;让我们看看查询。一次获取 100 行会更快。如果“1:06”表示 66 秒,那么我建议 MySQL 不是瓶颈。
它是否发出电子邮件,然后多处理可能(也可能不会)运行得更快。
也许有多个进程,每个独立运行(除了不命中相同的行)会更简单更快?
【讨论】:
是的,1:06 表示 66 秒。我收到邮件没有问题。第三个问题是什么意思?以上是关于使用 Python 发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章