Одна вещь, которую вы могли бы сделать, это изменить фокус вопроса на основное почтовое программное обеспечение. Например, если бы я хотел отправить тонну писем, я бы использовал любой язык для их записи в формате BSMTP, который в основном похож на простые команды клиента SMTP. Что-то вроде:
MAIL FROM:<me@example.com>
RCPT TO:<you@example.com>
DATA
From: Me <me@example.com>
To: You <you@example.com>
Subject: test email
This is the body of the test email I'm sending
.
Тогда я бы передавал файлы BSMTP через exim:
cat *.bsmtp | exim -bS
Это, по существу, устраняет задержку отправки электронных писем из вашей программы и накладывает бремя на exim (который, как MTA, лучше подготовлен для обработки).
Как только вы освоите основы, есть множество вещей, которые вы можете изменить, чтобы сделать их более эффективными. Например, если ваши электронные письма не настроены, вы можете предварительно оптимизировать их, поместив всех получателей в один и тот же домен в один и тот же файл BSMTP:
MAIL FROM:<me@example.com>
RCPT TO:<you@example.com>
RCPT TO:<him@example.com>
RCPT TO:<her@example.com>
RCPT TO:<them@example.com>
DATA
From: Me <me@example.com>
To: Me <me@example.com>
Subject: test email
This is the body of the test email I'm sending
.
Затем вы также получаете массу возможностей для оптимизации самой MTA для отправки почты (например, она будет автоматически обрабатывать параллельные доставки, доставки электронной почты на один и тот же почтовый сервер по тому же TCP-соединению и т. Д.) ).
Что касается выполнения этого в коде, то раньше у нас была библиотека Perl, которая помогла нам сделать это. По сути, вы отправили ему электронные письма и адреса, и при необходимости он прерывал звонки на почтовый сервер. Он настраивал количество параллельных сессий, которые он допускал, а также контролировал нагрузку на сервер и снижал скорость, если нагрузка превышала настраиваемый пользователем порог.