我想通过python发送电子邮件给亚马逊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封邮件的高峰,则不会阻止我,所以这就是我能做的所有分析。 / p>
有没有人以更好的方式做到这一点?我需要至少比现在快2倍。
我应该使用多个进程/线程/ asyncio,AWS SES REST API吗?
任何建议都会有所帮助
答案 0 :(得分:3)
我应该使用多个进程/线程/ asyncio,AWS SES REST API吗?
是
任何这些东西都允许你每秒发送比使用SMTP更多的邮件。
如果服务器和SES SMTP端点之间存在任何有意义的延迟,则SMTP将比使用API慢,特别是因为要使用SMTP发送邮件,首先必须协商TLS,然后是SMTP连线协议本身需要在邮件客户端代码和服务器之间进行多次往复交互(例如HELO
/ EHLO
,MAIL
,RCPT
,DATA
,QUIT
)浪费了大量的往返时间 - 再次,这浪费的时间取决于网络延迟。查询API(从技术上讲,SES没有真正的REST API)除了TLS设置之外没有任何这些时间浪费 - 它是简单的请求/响应 - 并且您的客户端可能更容易重用TLS会话HTTP keepalives。
但是请注意,无论你的筹码有多快,你都不能超过SES的发送限制 - 你有责任自己监管。由于SES观察到您的邮件质量以及缺乏投诉和反弹,限制开始很小然后自动增加......但是在优化时要小心 - 您不希望超出允许的请求数量。
答案 1 :(得分:1)
你试过boto3吗?我不确定它是否会更快。
The recommendation is to use https, multiple hosts, and multiple threads。 (见24,33-34,50-51一个用户提到1000封电子邮件/秒)
您可能最终会找到一个可以集体发送模板化电子邮件的其他邮件提供商。