使用 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 发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python发送电子邮件[关闭]

Python:使用 smtplib 模块发送电子邮件时未显示“主题”

使用 Python 示例发送电子邮件失败

在Python中使用SMTP发送电子邮件

python 使用Python发送和接收电子邮件

使用 python 3.7.3 发送带附件的电子邮件