You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by "Benoit Tellier (Jira)" <se...@james.apache.org> on 2022/02/17 06:56:00 UTC
[jira] [Closed] (JAMES-3693) Email rate limiting
[ https://issues.apache.org/jira/browse/JAMES-3693?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Benoit Tellier closed JAMES-3693.
---------------------------------
Fix Version/s: 3.7.0
Resolution: Fixed
> Email rate limiting
> -------------------
>
> Key: JAMES-3693
> URL: https://issues.apache.org/jira/browse/JAMES-3693
> Project: James Server
> Issue Type: New Feature
> Reporter: Tung TRAN
> Priority: Major
> Fix For: 3.7.0
>
> Attachments: redis-rate-limit-2022-01-28_16.09.42.mp4
>
> Time Spent: 15h 50m
> Remaining Estimate: 0h
>
> h3. Why
>
> Rate limiting is one of the common features. Examples: SaaS is one [https://www.fastmail.help/hc/en-us/articles/1500000277382-Account-limits#sending/receiving], [https://support.google.com/mail/answer/22839]
>
> They limit how many emails you can send/receive from/to each email account over a given period of time.
> We believe the rate-limiting will help James has more control of the resource and easy to dynamic config the user policy. It also complements the storage quota.
>
> h3. How
> - Create a new sub maven module for this extension. This extension will be dropped by default in one James installation (not of a runtime dependency)
> - The rate limit will have 2 criteria: number of emails and total size of emails
> - Create 3 mailets:
> * PerSenderRateLimit is per sender
> * PerRecipientRateLimit is per recipient
> * GlobalRateLimit for everyone
>
> The mailetcontainer configuration will look like:
> {code:xml}
>
> <mailet matcher="All" class="PerSenderRateLimit">
> (<redisURL>...</redisURL> + creds?)
> <!-- Appended before the type (count/size) and the sender mail address to store the current rate in Redis -->
> <redisKeyPrefix>xxx</redisKeyPrefix>
> <period>1hour</period>
> <count>100<count>
> <size>1GB</size>
> </mailet>
>
> <mailet matcher="All" class="PerRecipientRateLimit">
> (<redisURL>...</redisURL> + creds?)
> <!-- Appended before the type (count/size) and the sender mail address to store the current rate in Redis -->
> <redisKeyPrefix>xxx</redisKeyPrefix>
> <period>1hour</period>
> <count>100<count>
> <size>1GB</size>
> </mailet>
>
> <mailet matcher="All" class="GlobalRateLimit">
> (<redisURL>...</redisURL> + creds?)
> <!-- Appended before the type (count/size) and the sender mail address to store the current rate in Redis -->
> <redisKeyPrefix>xxx</redisKeyPrefix>
> <period>1hour</period>
> <count>100<count>
> <recipients>100<recipients>
> <size>1GB</size>
> <sizeForAllRecipients>5GB</sizeForAllRecipients>
> <exceededProcessor>tooMuchMails</exceededProcessor>
> </mailet> {code}
>
> - Create an interface RateLimiter, which will evaluate the current rate limit and return whether the result is acceptable or exceeded.
> - Create the implement InmemoryRateLimiter, which use guava-rate-limiter
> - Create a configuration POJO RedisRateLimiterConfiguration(Duration period, URL redisServerURL).
> - Create the implement RedisRateLimiter, which will use Redis to store the current rate of each email. Use [https://lettuce.io/] for the non-blocking Redis driver.
> - Write the document such as a setup, and provide a mailetcontainer sample file.
> h3. References
> - [https://www.baeldung.com/guava-rate-limiter]
> - [https://github.com/lettuce-io/lettuce-core#reactive-api]
--
This message was sent by Atlassian Jira
(v8.20.1#820001)
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org