В данной заметке рассмотрим, как настроить Exim для массовой рассылки, что бы письма отправлялись очень быстро.
1) Спул, логи.
Спул поместить на SSD или лучше на RAM-диск. Логи лучше отключить или уменьшить до минимума
no_message_logs
write_rejectlog=false
Разбиваем письма в спуле по подпапкам
split_spool_directory = true
2) Параметры доставки.
Не делать немедленной доставки. это обязательно для такого большого объема писем:
queue_only
queue_run_max = 500
Увеличиваем параметры соединений:
smtp_accept_max = 1000
smtp_accept_max_nonmail = 100
smtp_accept_max_per_connection = 500
smtp_accept_max_per_host = 1000
smtp_accept_queue_per_connection = 1000
smtp_connect_backlog = 200
smtp_receive_timeout = 5m
3) Прочие параметры.
exim делает ident запрос на локально сгенерированные письма. выключаем.
rfc1413_hosts =
rfc1413_query_timeout = 0s
остальные параметры:
bounce_return_size_limit = 100K
callout_domain_negative_expire = 3h
callout_domain_positive_expire = 1w
callout_negative_expire = 2h
callout_positive_expire = 1d
daemon_startup_sleep = 30s
delay_warning = 1d
dns_retrans = 0s
auto_thaw = 0s
local_scan_timeout = 1s
lookup_open_max = 25
message_body_visible = 500
message_size_limit = 50M
receive_timeout = 0s
received_headers_max = 30
remote_max_parallel = 500
retry_data_expire = 1w
retry_interval_max = 1d
...
remote_smtp:
...
# plain text smtp быстрее чем tls
hosts_avoid_tls=*
# меньше таймаут - быстрее обрабатается очередь
connect_timeout = 10s
...
begin retry
# макс. время жизни письма в очереди 24h
* * F,2h,15m; G,24h,1h,1.5;
4) Примечание.
Если не с этими параметрами не удалось достичь результата, то можно применять такой скрипт. Поставить в cron на ежеминутный запуск. Переменную LIMIT делаем соразмерно имеющейся памяти, одна копия exim жрет около 30Mb.
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
LIMIT=100
COUNT=`pgrep exim | wc -l`
echo $COUNT exims are running
if [ "$COUNT" -lt "$LIMIT" ]
then
echo starting new 10
for i in `seq 10`; do exim -q & done
else
echo doing nothing
fi