2016-05-19 4 views
2

Я хочу отправить электронную почту через python на амазонку SES.Что было бы самым быстрым способом отправки электронных писем на SAS амазонки?

Я бы хотел достичь скорости отправки около 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('[email protected]', '[email protected]', str(msg)) 

# I send 5 mails here 
send_multiple_emails('about 100 byte message', number=5) 

Нижняя строка: Это занимает 4,5 секунды, чтобы отправить 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 раз, это занимает 2 секунды, чтобы отправить 5 электронных писем. enter image description here

На данный момент я могу только послать 200 писем в день и 1 электронную почту в секунду, хотя, если я просто отправить шипы из 5 писем, он не блокирует меня, так что это все анализы я могу делать.

Кто-нибудь делает это лучше? Мне нужно быть как минимум в 2 раза быстрее, чем я.

Должен ли я использовать несколько процессов/потоков/асинцио, API AWS SES REST?

Любые советы были бы полезны

+0

Некоторые интернет-провайдеры могут пометить вашу учетную запись как отправителя спама, если вы слишком скоро отправите слишком много. – Marichyasana

ответ

1

Вы пробовали boto3? Я не уверен, будет ли это быстрее.

The recommendation is to use https, multiple hosts, and multiple threads. (см. 24, 33-34, 50-51 один пользователь упоминает 1000 электронных писем/сек)

Возможно, вы попадете в другой почтовый провайдер, который может отправлять шаблонизированные письма в массе.

3

Должен ли я использовать несколько процессов/потоков/асинцио, API AWS SES REST?

Да.

Любая из этих вещей позволит вам отправлять больше сообщений в секунду, чем используя SMTP.

SMTP будет работать медленнее, чем при использовании API, если есть какая-либо значимая задержка между вашим сервером и конечной точкой SES SMTP, в частности, поскольку для отправки сообщения с SMTP сначала нужно согласовать TLS, а затем SMTP-провод сам протокол требует нескольких шагов взаимодействия между вашим почтовым клиентом и сервером (например, HELO/EHLO, MAIL, RCPT, DATA, QUIT), который отнимает много времени в оба конца - снова, сколько времени эти отходы зависят от латентности сети. API запросов (технически, SES не имеет истинного API REST) ​​не имеет ни одного из этих временных участников, кроме настройки TLS - это простой запрос/ответ, и ваш клиент может, вероятно, более легко повторно использовать сеансы TLS с HTTP keepalives.

Обратите внимание, что существуют ограничения на отправку SES, которые вы не можете превышать, независимо от того, насколько быстро ваш стек - и вы несете ответственность за охрану себя. Пределы начинаются с малого, а затем автоматически увеличиваются, поскольку SES наблюдает за качеством вашей почты и отсутствием жалоб и отскоков ... но будьте осторожны при оптимизации - вы не хотите переполнять свое разрешенное количество запросов.

Смежные вопросы