diff --git a/filtermail/src/config.rs b/filtermail/src/config.rs index 04ef6997..96f7f08e 100644 --- a/filtermail/src/config.rs +++ b/filtermail/src/config.rs @@ -17,7 +17,10 @@ pub struct Config { pub postfix_reinject_port_incoming: u16, #[serde(default = "Config::default_max_message_size")] pub max_message_size: usize, + #[serde(default = "Config::default_max_user_send_per_minute")] pub max_user_send_per_minute: NonZeroU32, + #[serde(default = "Config::default_max_user_send_burst_size")] + pub max_user_send_burst_size: NonZeroU32, #[serde(default, deserialize_with = "deserialize_sequence")] pub passthrough_senders: Vec, #[serde(default, deserialize_with = "deserialize_sequence")] @@ -94,4 +97,10 @@ impl Config { const fn default_max_message_size() -> usize { 31457280 } + const fn default_max_user_send_per_minute() -> NonZeroU32 { + NonZeroU32::new(60).expect("60 != 0") + } + const fn default_max_user_send_burst_size() -> NonZeroU32 { + NonZeroU32::new(10).expect("10 != 0") + } } diff --git a/filtermail/src/outbound.rs b/filtermail/src/outbound.rs index 907e9caf..37858c34 100644 --- a/filtermail/src/outbound.rs +++ b/filtermail/src/outbound.rs @@ -20,7 +20,8 @@ pub struct OutgoingBeforeQueueHandler { impl OutgoingBeforeQueueHandler { pub fn new(config: Config) -> Self { - let quota = Quota::per_minute(config.max_user_send_per_minute); + let quota = Quota::per_minute(config.max_user_send_per_minute) + .allow_burst(config.max_user_send_burst_size); Self { config: Arc::new(config), send_rate_limiter: RateLimiter::keyed(quota),