Python многопоточный SMTP-прокси - PullRequest
0 голосов
/ 27 января 2020

Я сделал SMTP-прокси, состоящий из нескольких экземпляров smtpd.SMTPServer, работающих на 5 разных портах, получающих, анализирующих и повторно вводящих электронные письма в Postfix в настройке с балансировкой нагрузки.

Все работает хорошо, но у меня есть не удалось запустить каждый экземпляр на отдельных потоках. Я хочу подождать около 30/40 секунд между анализом и доставкой одного письма (для дальнейшей обработки), но если я поставлю time.sleep, все экземпляры будут заблокированы.

Я бы хотел переключиться на параллельное обработка вместо последовательной, чтобы иметь 5 параллельных потоков обработки, вот скелет моего однопоточного кода:

class My_Proxy(smtpd.SMTPServer):
        def process_message(self, peer, mailfrom, rcpttos, data, decode_data=True):
        ###PARSING AND PROCESSING STUFF...
        time.sleep( 30 ) ###BLOCKING SLEEP
        ###SEND TO FINAL MTA
        server.sendmail(mailfrom, rcpttos, data_rewrite_https)
        server.quit()

#FIVE INSTANCES DIFFERENT PORTS
server1 = My_Proxy(('127.0.0.1', 10027), None)
server2 = My_Proxy(('127.0.0.1', 10029), None)
server3 = My_Proxy(('127.0.0.1', 10031), None)
server4 = My_Proxy(('127.0.0.1', 10033), None)
server5 = My_Proxy(('127.0.0.1', 10035), None)
asyncore.loop()

1 Ответ

0 голосов
/ 30 января 2020

решаемая. Для тех, кто в конечном итоге испытывает те же проблемы: если вы хотите многопоточность, вам нужно переключиться на aiosmtpd на основе asyncio и затем иметь возможность параллельной обработки почты.

Smtpd asyncore l oop просто продолжайте работать последовательно, так что time.sleep () будет приостанавливать всю обработку, а не одну почту.

Единственным плохим до сих пор является более сложное управление почтовым контентом. Там, где smtpd прозрачно управляет телом, кодировкой, вложениями, с помощью aiosmtpd вам нужно отдельно разобрать части конверта и кодировку.

...