Postfix — ограничить поток исходящих писем

Thank you for reading this post, don't forget to subscribe!

Поч­то­вый сер­вер postfix ори­ен­ти­ро­ван на мак­си­маль­ную про­из­во­ди­тель­ность. Если у него есть пись­мо, то он поста­ра­ет­ся его как мож­но быст­рее отпра­вить. Но ино­гда тре­бу­ет­ся огра­ни­чить поток исхо­дя­щих писем. При этом жела­тель­но, что­бы postfix про­дол­жал при­ни­мать пись­ма без огра­ни­че­ний, но отправ­лял их посте­пен­но. Быва­ет, что про­вай­дер огра­ни­чи­ва­ет ваш сер­вер и раз­ре­ша­ет отправ­лять, напри­мер, не более 300 писем в минуту.

В этом слу­чае помо­жет настрой­ка в /etc/postfix/main.cf:

smtp_transport_rate_delay = 1s

Дан­ная настрой­ка уста­нав­ли­ва­ет задерж­ку меж­ду отправ­кой писем. Если уста­но­вить зна­че­ние в 20s, то сер­вер будет отправ­лять не более трёх писем в мину­ту. Воз­мож­но исполь­зо­вать зна­че­ния: s (seconds), m (minutes), h (hours), d (days), w (weeks).

Всё бы хоро­шо, но есть одна про­бле­ма. Мини­маль­но мож­но ука­зать задерж­ку в одну секун­ду. Это озна­ча­ет, что сер­вер не смо­жет за одну мину­ту отпра­вить более 60 писем. За час он отпра­вит 3600 писем, за день — 86400 писем. Ещё нуж­но учесть, что сер­вер будет так­же пытать­ся отпра­вить повтор­но пись­ма, кото­рые по каким-то при­чи­нам не смог­ли отпра­вить­ся в пер­вый раз.

Это мало. Как под­стро­ить­ся под про­вай­де­ра и отправ­лять хотя бы 300 писем в минуту?

Мож­но сде­лать несколь­ко экзем­пля­ров postfix на одном сер­ве­ре — Multi Instance. Под­ни­ма­ем пять экзем­пля­ров postfix, и 60 писем в мину­ту пре­вра­ща­ют­ся уже в 300, что и тре­бо­ва­лось полу­чить. Управ­ляя коли­че­ством экзем­пля­ров postfix, мож­но регу­ли­ро­вать ско­рость отправ­ки писем.

Если у вас есть толь­ко один IP адрес, то мож­но под­нять экзем­пля­ры postfix на раз­ных пор­тах, после чего балан­си­ро­вать нагруз­ку с помо­щью haproxy. Будь­те осто­рож­ны с аутен­ти­фи­ка­ци­ей, после haproxy все экзем­пля­ры postfix будут счи­тать, что пись­мо им при­шло от localhost. В слу­чае с haproxy вместо:

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination

луч­ше использовать:

smtpd_relay_restrictions = permit_sasl_authenticated reject_unauth_destination

Ина­че вы рис­ку­е­те сде­лать из ваше­го защи­щён­но­го сер­ве­ра откры­тый релей.