python - 向亚马逊 SES 发送电子邮件的最快方式是什么?

标签 python email amazon-web-services amazon-ses

我想通过 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)

底线:发送 5 封电子邮件需要 4.5 秒。 sending 5 emails through SMTH to amazon SES

然后我尝试了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 秒。 enter image description here

目前,我每天只能发送 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/EHLOMAILRCPT, DATA, QUIT) 浪费了大量的往返时间——同样,这浪费了多少时间取决于网络延迟。查询 API(从技术上讲,SES 没有真正的 REST API)除了 TLS 设置之外没有任何这些浪费时间的东西——它是简单的请求/响应——你的客户端可能更容易重用 TLS session HTTP 保活。

但请注意,无论您的堆栈多快,您都不能超过 SES 的发送限制——您有责任 self 监管。限制一开始很小,然后随着 SES 观察您的邮件质量以及没有投诉和退回邮件而自动增加...但在优化时要小心——您不想超出允许的请求数量。

关于python - 向亚马逊 SES 发送电子邮件的最快方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37326728/

相关文章:

Python MySQL 模块

email - Jenkins 电子邮件插件不会向破坏构建的用户发送电子邮件

Python 3.6 Mbox 到 CSV

Django 电子邮件后端设置不起作用

python - 在 Excel 中打印输出

python - GSpread 导入错误 : No module named oauth2client. service_account

Python - 在类中动态添加方法的推荐方法

amazon-web-services - 从 Amazon Redshift 导出到 RDS MySQL 数据库

node.js - AWS ElasticBeanStalk Node 中的套接字 Io

amazon-web-services - AWS CloudFormation 用户数据中的 Crontab