ATTENZIONE: Su versioni Debian più datate (da Debian 6 Squeeze a Debian 9 Stretch) è probabile che venga installato il pacchetto postfix-policyd invece del più nuovo policyd-rate-limit.
Si installa il pacchetto policyd-rate-limit:
Nel file di configurazione /etc/policyd-rate-limit.yaml il parametro più importante è limits:
limits: - [10, 60] # limit to 10 mails by minutes - [150, 86400] # limits to 150 mails by days
Oltre all login sasl, è possibile tenere traccia e limitare anche il sender e l'indirizzo IP. Queste opzioni sono disabilitate per impostazione predefinita.
È possibile specificare delle eccezioni (in eccesso o in difetto) per un particolare identificativo.
Per aggiungerlo ai filtri utilizzati da Postfix è sufficiente ad esempio aggiungerlo alla catena dei filtri smtpd_relay_restrictions:
check_policy_service { unix:ratelimit/policy, default_action=DUNNO }
Nel database esiste una tabella mail_count con un record per ogni mail inviata, nella riga compare il nome di login e il timestamp dell'invio:
sqlite3 /var/lib/policyd-rate-limit/db.sqlite3 sqlite> SELECT * FROM mail_count; username@example.org|1612865208 username@example.org|1612865556
Il database può (deve) essere svuotato regolarmente eseguendo policyd-rate-limit --clean ad esempio con un cronjob:
0 0 * * * policyd-rate-limit /usr/local/bin/policyd-rate-limit --clean >/dev/null
Vengono automaticamente rimossi tutti i record che hanno un timestamp più vecchio del doppio del limite temporale maggiore.
Se nella configurazione sono abilitati i report, nel database viene creata anche la tabella limit_report, anch'essa viene svuotata regolarmente dall'opzione --clean.
Il processo logga in /var/log/syslog con il tag policyd-rate-limit. Nel file di configurazione c'è l'opzione predefinita debug: True, sembra che non ci sia la possibilità di modificare la quantità di informazioni registrate (tante!).
Il limite viene giustamente applicato al numero dei destinatari, se una mail contiene destinatari multipli e il totale eccede il limite disponibile, alcuni destinatari vengono scartati. Nei log di Postfix si trova segnalato il rifiuto:
postfix/smtpd[23150]: 5DBFB7DA5B: reject: RCPT from unknown[10.11.12.13]: 450 4.7.1 <recipient@example2.org>: Recipient address rejected: Rate limit reach, retry later; from=<sender@example.org> to=<recipient@example2.org> proto=ESMTP helo=<mail.example.org>
Cioè l'azione predefinita è DEFER_IF_PERMIT (vedere Postfix Access) con relativo messaggio SMTP 4.7.1.
Un client di posta dovrebbe segnalare l'errore e considerare il messaggio non inviato, ma in generale non è possibile capire quali destinatari sono stati accettati e quali rifiutati. Ad esempio Thunderbird mostra un pop-up con il seguente messaggio:
An error occurred while sending mail. The mail server responded: 4.7.1 <recipient@example2.org>: Recipient address rejected: Rate limit reach, retry later. Please check the message recipient "recipient@example2.org" and try again.