| Crates.io | policyd-rate-limit |
| lib.rs | policyd-rate-limit |
| version | 1.0.1 |
| created_at | 2020-02-03 13:02:41.90263+00 |
| updated_at | 2025-04-23 14:10:05.504523+00 |
| description | Postfix rate limiter SMTP policy daemon |
| homepage | https://github.com/nbari/policyd-rate-limit |
| repository | https://github.com/nbari/policyd-rate-limit |
| max_upload_size | |
| id | 204439 |
| size | 104,934 |
Postfix rate limiter SMTP policy daemon
It depends on the Postfix policy delegation protocol, it searches for the sasl_username and based on the defined limits stored in a SQL(MySQL/PostgreSQL/SQLite) database it rejects or allows action=DUNNO the email to be sent.
Postfix policy daemon for rate limiting
Usage: policyd-rate-limit [OPTIONS] --dsn <dsn>
Options:
-s, --socket <SOCKET> Path to the Unix domain socket [default: /tmp/policy-rate-limit.sock]
--dsn <dsn> Database connection string [env: DSN=]
--pool <pool> Pool size for database connections [default: 5]
-l, --limit <limit> Maximum allowed messages [default: 10]
-r, --rate <rate> rate in seconds, limits the messages to be sent in the defined period [default: 86400]
-v, --verbose... Increase verbosity, -vv for debug
-h, --help Print help
-V, --version Print version
The database schema (postgres example):
CREATE TABLE IF NOT EXISTS ratelimit (
username VARCHAR(128) NOT NULL, -- sender address (SASL username)
quota INTEGER NOT NULL DEFAULT 0, -- limit
used INTEGER NOT NULL DEFAULT 0, -- current recipient counter
rate INTEGER DEFAULT 0, -- seconds after which the counter gets reset
rdate TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, -- datetime when counter was reset
PRIMARY KEY (username)
);
Add the path of the policy-rate-limit socket to smtpd_sender_restrictions for example:
smtpd_sender_restrictions: check_policy_service { unix:/tmp/policy-rate-limit.sock, default_action=DUNNO }
check the perms of the socket