我想通过 python 向 amazon SES 发送电子邮件。
我希望达到每秒大约 10 封邮件的发送速率(实际上,理想情况下是两倍)。
我发现,如果我使用 python smtplib
库直接连接,事情真的很慢。这是使用 pycallgraph 生成的图表,显示了我使用此代码时发生的情况
def login_to_amazon(port=587, secure=True, options=(25, 465, 587)):
s1 = smtplib.SMTP('email-smtp.us-east-1.amazonaws.com', port)
if secure:
s1.starttls()
s1.login('aws_key', 'aws_secret')
return s1
def send_multiple_emails(msg, number, port=587):
s1 = login_to_amazon(port)
for _ in range(number):
s1.sendmail('address@provider.com', 'address@provider.com', str(msg))
# I send 5 mails here
send_multiple_emails('about 100 byte message', number=5)
然后我尝试了boto界面:
from boto import ses
c1 = ses.connect_to_region('us-east-1', aws_access_key_id='public_key', aws_secret_key='secret')
def boto_send_mail(nonce=None):
if nonce is None:
nonce = str(datetime.now())
return c1.send_email(source, subject='testing {}'.format(str(nonce)), body=str(nonce), to_addresses=source)
现在,如果我调用 boto_send_mail
5 次,发送 5 封电子邮件需要 2 秒。
目前,我每天只能发送 200 封电子邮件,每秒发送 1 封电子邮件,但如果我只是发送 5 封邮件的峰值,它不会阻止我,所以这就是我能做的所有分析。
有没有人以更好的方式做到这一点?我需要至少比现在快 2 倍。
我应该使用多进程/线程/asyncio,AWS SES REST API 吗?
任何建议都会有帮助
最佳答案
Should I use multiple processes/ threads/ asyncio, the AWS SES REST API?
是的。
与使用 SMTP 相比,任何这些都可以让您每秒发送更多消息。
如果您的服务器和 SES SMTP 端点之间存在任何有意义的延迟,SMTP 将比使用 API 慢,特别是因为要使用 SMTP 发送消息,首先您必须协商 TLS,然后是 SMTP 有线协议(protocol)本身需要邮件客户端代码和服务器之间的几个来回交互步骤(例如 HELO
/EHLO
、MAIL
、RCPT
, DATA
, QUIT
) 浪费了大量的往返时间——同样,这浪费了多少时间取决于网络延迟。查询 API(从技术上讲,SES 没有真正的 REST API)除了 TLS 设置之外没有任何这些浪费时间的东西——它是简单的请求/响应——你的客户端可能更容易重用 TLS session HTTP 保活。
但请注意,无论您的堆栈多快,您都不能超过 SES 的发送限制——您有责任 self 监管。限制一开始很小,然后随着 SES 观察您的邮件质量以及没有投诉和退回邮件而自动增加...但在优化时要小心——您不想超出允许的请求数量。
关于python - 向亚马逊 SES 发送电子邮件的最快方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37326728/