Repository: matrix-org/synapse

Issue:
Notification emails have URLs hardcoded to vector.im/matrix.to
This should probably be configurable, so people who are self-hosting _both_ Synapse and Riot can have notification emails with URLs which point to their self-hosted Riot instance.




Discussion:
The code in question lives in [synapse/push/mailer.py](https://github.com/matrix-org/synapse/blob/master/synapse/push/mailer.py#L441-L457):

```python
def make_room_link(self, room_id):
        # need /beta for Universal Links to work on iOS
        if self.app_name == "Vector":
            return "https://vector.im/beta/#/room/%s" % (room_id,)
        else:
            return "https://matrix.to/#/%s" % (room_id,)

    def make_notif_link(self, notif):
        # need /beta for Universal Links to work on iOS
        if self.app_name == "Vector":
            return "https://vector.im/beta/#/room/%s/%s" % (
                notif['room_id'], notif['event_id']
            )
        else:
            return "https://matrix.to/#/%s/%s" % (
                notif['room_id'], notif['event_id']
            )
```

Probably a new setting for the `email` section in `homeserver.yaml` would do, for example:

```yaml
email:
  riot_base_url: "http://riot.domain.com/"
  ...
```

What do you think about this? I can make a PR for this.


Resolving patch:
diff --git a/synapse/config/emailconfig.py b/synapse/config/emailconfig.py
--- a/synapse/config/emailconfig.py
+++ b/synapse/config/emailconfig.py
@@ -68,6 +68,9 @@ def read_config(self, config):
             self.email_notif_for_new_users = email_config.get(
                 "notif_for_new_users", True
             )
+            self.email_riot_base_url = email_config.get(
+                "riot_base_url", None
+            )
             if "app_name" in email_config:
                 self.email_app_name = email_config["app_name"]
             else:
@@ -85,6 +88,9 @@ def read_config(self, config):
     def default_config(self, config_dir_path, server_name, **kwargs):
         return """
         # Enable sending emails for notification events
+        # Defining a custom URL for Riot is only needed if email notifications
+        # should contain links to a self-hosted installation of Riot; when set
+        # the "app_name" setting is ignored.
         #email:
         #   enable_notifs: false
         #   smtp_host: "localhost"
@@ -95,4 +101,5 @@ def default_config(self, config_dir_path, server_name, **kwargs):
         #   notif_template_html: notif_mail.html
         #   notif_template_text: notif_mail.txt
         #   notif_for_new_users: True
+        #   riot_base_url: "http://localhost/riot"
         """
diff --git a/synapse/push/mailer.py b/synapse/push/mailer.py
--- a/synapse/push/mailer.py
+++ b/synapse/push/mailer.py
@@ -439,15 +439,23 @@ def make_summary_text(self, notifs_by_room, room_state_ids,
                 })
 
     def make_room_link(self, room_id):
-        # need /beta for Universal Links to work on iOS
-        if self.app_name == "Vector":
-            return "https://vector.im/beta/#/room/%s" % (room_id,)
+        if self.hs.config.email_riot_base_url:
+            base_url = self.hs.config.email_riot_base_url
+        elif self.app_name == "Vector":
+            # need /beta for Universal Links to work on iOS
+            base_url = "https://vector.im/beta/#/room"
         else:
-            return "https://matrix.to/#/%s" % (room_id,)
+            base_url = "https://matrix.to/#"
+        return "%s/%s" % (base_url, room_id)
 
     def make_notif_link(self, notif):
-        # need /beta for Universal Links to work on iOS
-        if self.app_name == "Vector":
+        if self.hs.config.email_riot_base_url:
+            return "%s/#/room/%s/%s" % (
+                self.hs.config.email_riot_base_url,
+                notif['room_id'], notif['event_id']
+            )
+        elif self.app_name == "Vector":
+            # need /beta for Universal Links to work on iOS
             return "https://vector.im/beta/#/room/%s/%s" % (
                 notif['room_id'], notif['event_id']
             )


Test patch: