s5s*_*s5s 2 python email performance smtp
我有下面的脚本,我用它自己发送 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')
Run Code Online (Sandbox Code Playgroud)
在此脚本中,设置 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)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果你的Python版本没有那么.send_message()你可以使用:
smtp_serv.sendmail(from, to, msg.as_string())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10253 次 |
| 最近记录: |