Skip to main content
 首页 » 编程设计

Python 发邮件太慢

2025年05月04日27artech

我有下面的脚本,我用它来自己发送 10 条消息<->我自己。但是,我注意到 Python 确实需要一段时间才能做到这一点。去年我需要一个系统来发送大约 200 封带有附件和文本的电子邮件,我用 msmtp + bash 实现了它。据我所知,它要快得多。

将 while 循环移到内部(围绕 smtp_serv.sendmail(sender, recepient, msg) 函数会产生类似的结果)。

我做错了什么吗?它肯定不会比 bash + msmtp 慢(而且我只发送一条“嗨”消息,没有附件)。

#! /usr/bin/python3.1 
 
def sendmail(recepient,  msg): 
 
    import smtplib 
 
    # Parameters 
    sender = 'login@gmail.com' 
    password = 'password' 
    smtpStr = 'smtp.gmail.com' 
    smtpPort = 587 
    # /Parameters 
 
    smtp_serv = smtplib.SMTP(smtpStr, smtpPort) 
    smtp_serv.ehlo_or_helo_if_needed() 
    smtp_serv.starttls() 
    smtp_serv.ehlo() 
 
    recepientExists = smtp_serv.verify(recepient) 
    if recepientExists[0] == 250: 
        smtp_serv.login(sender, password) 
        try: 
            smtp_serv.sendmail(sender, recepient, msg) 
        except smtplib.SMTPException: 
            print(recepientExists[1]) 
    else: 
        print('Error',   recepientExists[0], ':',  recepientExists[1]) 
 
    smtp_serv.quit() 
 
for in in range(10): 
    sendmail('receiver@gmail.com',  'hi') 

请您参考如下方法:

在此脚本中,设置 SMTP 连接(5 秒)的时间是发送电子邮件(1 秒)的五倍,因此设置单个连接并发送多封电子邮件而不是创建电子邮件是有意义的每次连接:

#!/usr/bin/env python3 
import smtplib     
from contextlib import contextmanager 
from datetime   import datetime 
from email.mime.text import MIMEText 
from netrc      import netrc 
from timeit     import default_timer as timer 
 
@contextmanager 
def logined(sender, password, smtp_host='smtp.gmail.com', smtp_port=587): 
    start = timer(); smtp_serv = smtplib.SMTP(smtp_host, smtp_port, timeout=10) 
    try: # make smtp server and login 
        smtp_serv.ehlo_or_helo_if_needed() 
        smtp_serv.starttls() 
        smtp_serv.ehlo() 
        print('smtp setup took (%.2f seconds passed)' % (timer()-start,)) 
        start = timer(); smtp_serv.login(sender, password) 
        print('login took %.2f seconds' % (timer()-start,)) 
        start = timer(); yield smtp_serv 
    finally: 
        print('Operations with smtp_serv took %.2f seconds' % (timer()-start,)) 
        start = timer(); smtp_serv.quit() 
        print('Quiting took %.2f seconds' % (timer()-start,)) 
 
smtp_host = 'smtp.gmail.com' 
login, _, password = netrc().authenticators(smtp_host) 
with logined(login, password, smtp_host) as smtp_serv: 
    for i in range(10): 
        msg = MIMEText('#%d timestamp %s' % (i, datetime.utcnow())) 
        msg['Subject'] = 'test #%d' % i 
        msg['From'] = login 
        msg['To'] = login 
        smtp_serv.send_message(msg)  

输出

smtp setup took (5.43 seconds passed) 
login took 0.40 seconds 
Operations with smtp_serv took 9.84 seconds 
Quiting took 0.05 seconds 

如果你的 Python 版本没有 .send_message() 那么你可以使用:

smtp_serv.sendmail(from, to, msg.as_string())