diff --git a/changelog.d/8965.bugfix b/changelog.d/8965.bugfix
new file mode 100644
index 000000000..cbccebddb
--- /dev/null
+++ b/changelog.d/8965.bugfix
@@ -0,0 +1 @@
+Fix a longstanding bug where a `m.image` event without a `url` would cause errors on push.
diff --git a/synapse/push/mailer.py b/synapse/push/mailer.py
index 9ff092e8b..4d875dcb9 100644
--- a/synapse/push/mailer.py
+++ b/synapse/push/mailer.py
@@ -486,7 +486,11 @@ class Mailer:
def add_image_message_vars(
self, messagevars: Dict[str, Any], event: EventBase
) -> None:
- messagevars["image_url"] = event.content["url"]
+ """
+ Potentially add an image URL to the message variables.
+ """
+ if "url" in event.content:
+ messagevars["image_url"] = event.content["url"]
async def make_summary_text(
self,
diff --git a/synapse/res/templates/notif.html b/synapse/res/templates/notif.html
index 6d76064d1..0aaef97df 100644
--- a/synapse/res/templates/notif.html
+++ b/synapse/res/templates/notif.html
@@ -29,7 +29,7 @@
{{ message.body_text_html }}
{%- elif message.msgtype == "m.notice" %}
{{ message.body_text_html }}
- {%- elif message.msgtype == "m.image" %}
+ {%- elif message.msgtype == "m.image" and message.image_url %}
{%- elif message.msgtype == "m.file" %}
{{ message.body_text_plain }}