Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Add config to change the delay before sending a notification email #16696

Merged
merged 5 commits into from
Dec 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/16696.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add a setting to be able to tweak the delay without interaction before an email is sent following a notification.
5 changes: 5 additions & 0 deletions docs/usage/configuration/config_documentation.md
Original file line number Diff line number Diff line change
Expand Up @@ -680,6 +680,11 @@ This setting has the following sub-options:
has missed. Disabled by default.
* `notif_for_new_users`: Set to false to disable automatic subscription to email
notifications for new users. Enabled by default.
* `notif_delay_before_mail`: The time to wait before emailing about a notification.
This gives the user a chance to view the message via push or an open client.
Defaults to 10 minutes.

_New in Synapse 1.99.0._
* `client_base_url`: Custom URL for client links within the email notifications. By default
links will be based on "https://matrix.to". (This setting used to be called `riot_base_url`;
the old name is still supported for backwards-compatibility but is now deprecated.)
Expand Down
5 changes: 5 additions & 0 deletions synapse/config/emailconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,11 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None:
self.email_riot_base_url = email_config.get(
"client_base_url", email_config.get("riot_base_url", None)
)
# The amount of time we always wait before ever emailing about a notification
# (to give the user a chance to respond to other push or notice the window)
self.notif_delay_before_mail_ms = Config.parse_duration(
email_config.get("notif_delay_before_mail", "10m")
)

if self.root.account_validity.account_validity_renew_by_email_enabled:
expiry_template_html = email_config.get(
Expand Down
15 changes: 6 additions & 9 deletions synapse/push/emailpusher.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,9 @@

logger = logging.getLogger(__name__)

# The amount of time we always wait before ever emailing about a notification
# (to give the user a chance to respond to other push or notice the window)
DELAY_BEFORE_MAIL_MS = 10 * 60 * 1000

# THROTTLE is the minimum time between mail notifications sent for a given room.
# Each room maintains its own throttle counter, but each new mail notification
# sends the pending notifications for all rooms.
THROTTLE_START_MS = 10 * 60 * 1000
THROTTLE_MAX_MS = 24 * 60 * 60 * 1000 # 24h
# THROTTLE_MULTIPLIER = 6 # 10 mins, 1 hour, 6 hours, 24 hours
THROTTLE_MULTIPLIER = 144 # 10 mins, 24 hours - i.e. jump straight to 1 day
Expand Down Expand Up @@ -80,6 +75,8 @@ def __init__(self, hs: "HomeServer", pusher_config: PusherConfig, mailer: Mailer
except ValueError:
raise PusherConfigException("Invalid email")

self._delay_before_mail_ms = self.hs.config.email.notif_delay_before_mail_ms

def on_started(self, should_check_for_notifs: bool) -> None:
"""Called when this pusher has been started.

Expand Down Expand Up @@ -180,7 +177,7 @@ async def _unsafe_process(self) -> None:
received_at = push_action.received_ts
if received_at is None:
received_at = 0
notif_ready_at = received_at + DELAY_BEFORE_MAIL_MS
notif_ready_at = received_at + self._delay_before_mail_ms

room_ready_at = self.room_ready_to_notify_at(push_action.room_id)

Expand All @@ -196,7 +193,7 @@ async def _unsafe_process(self) -> None:
"room_id": push_action.room_id,
"now": self.clock.time_msec(),
"received_at": received_at,
"delay_before_mail_ms": DELAY_BEFORE_MAIL_MS,
"delay_before_mail_ms": self._delay_before_mail_ms,
"last_sent_ts": self.get_room_last_sent_ts(push_action.room_id),
"throttle_ms": self.get_room_throttle_ms(push_action.room_id),
}
Expand Down Expand Up @@ -300,10 +297,10 @@ async def sent_notif_update_throttle(
current_throttle_ms = self.get_room_throttle_ms(room_id)

if gap > THROTTLE_RESET_AFTER_MS:
new_throttle_ms = THROTTLE_START_MS
new_throttle_ms = self._delay_before_mail_ms
else:
if current_throttle_ms == 0:
new_throttle_ms = THROTTLE_START_MS
new_throttle_ms = self._delay_before_mail_ms
else:
new_throttle_ms = min(
current_throttle_ms * THROTTLE_MULTIPLIER, THROTTLE_MAX_MS
Expand Down
Loading