The email renders badly
Connect renders mail through a sanitiser that removes active content and anything that would reach out of the message, then rewrites remote references to its own proxy. Elaborate marketing layouts lose most of their styling as a result. The stored message is untouched, so the original is always available at the provider.
What the symptom looks like#
- A newsletter that arrives as a column of text with the layout gone.
- Buttons that render as ordinary links, and background colours that have vanished.
- A signature block that has lost its alignment or its logo.
- A message that reads perfectly at the provider and looks plain here.
What should never happen is missing words. Sanitising removes markup and active content, not content. If text is missing rather than unstyled, that is worth reporting, and it is a different problem from an unstyled layout.
Why the sanitiser is aggressive#
An email is markup written by a stranger and rendered inside an application that holds a business's conversations. Treated casually, that markup can run code, reach across the page into the application's own interface, or call out to a server the moment a message is opened. mail_render.py therefore takes an aggressive line: active content is removed, anything that would escape the message is removed, and remote references are rewritten to the proxy rather than fetched by your browser.
The trade is deliberate and it is not symmetrical. Losing a marketing layout costs nothing that matters. Rendering a stranger's markup faithfully inside an application holding customer conversations costs something that cannot be undone. Where a message is trying to influence Connect rather than you, prompt injection arrives as ordinary business mail covers the related problem.
| Element | What you see | What changes | What can fail |
|---|---|---|---|
| Text and links | Everything, in order | Nothing | Nothing — missing text is a fault, not a policy |
| Active content | Removed entirely | The message renders as static markup | Expecting an interactive email to work; nothing in a message runs here |
| Layout and styling | Simplified, sometimes heavily | A plainer rendering of the same content | A layout that carried meaning — a table of figures is worth checking at the provider |
| Remote resources | Fetched through the proxy or not at all | The sender learns nothing about the reader | Images not loading covers this in full |
| Attachments | Available as they arrived | Nothing | Confusing an inline graphic with an attachment; they are different things |
The rendering path#
- Trigger — you open a message with an HTML body.
- External event — the markup was written by the sender's system and arrived unchanged.
- Authentication and workspace resolution — the message is read inside the workspace that owns it.
- Ingest — the stored body is passed to
mail_render.pyfor rendering; the stored copy is never overwritten. - Canonical record — the
messagesrow keeps the original, which is what makes the rendering a view rather than an edit. - Classification — active content, escaping markup and remote references are each handled differently.
- Knowledge, memory and rules — the engine reads the message's content, and rendering decisions are about what a person sees on screen.
- Autonomy and approval — not involved; reading is not a gated action.
- Action — the sanitised markup is rendered, with remote references pointed at the proxy.
- Result — a readable message, sometimes a plainer one than the sender intended.
- Relationship, timeline and memory — unaffected by how the message looked.
- Audit, usage and Needs You — nothing is queued; rendering is not a decision.
What Connect did complete#
- The message was fetched and bridged in full, and the original body is stored exactly as it arrived.
- Every word, link and attachment is present and reachable.
- Active and escaping markup was removed before anything reached your screen.
- The sender was told nothing about the reader by the act of opening the message.
What Connect did not complete#
- It did not reproduce the sender's layout faithfully, and it does not attempt to.
- It did not run anything the message contained, including anything a sender might have intended to run.
- It did not rewrite or repair markup that was already malformed when it arrived.
- It did not alter the stored message, so nothing here is irreversible.
Seeing the original safely, and when to escalate#
Read the text first and decide whether the layout matters at all.
Result For most business mail the answer is no, and the rendered view is enough.
Where it does matter, open the same message in the provider's own client.
Result You see the sender's intended rendering, having chosen the risk knowingly rather than by default.
For a message whose meaning depends on its structure — a table of figures, a quotation — check the numbers at the provider before acting on them.
Result A simplified table is readable and can be harder to scan than the original.
Ask frequent senders for a plain-text alternative.
Result Mail sent with a text alternative reads correctly everywhere, including here.
An administrator can compare a stored message with what is rendered to confirm nothing textual was lost, and can check whether one sender's mail is consistently affected. Escalate when text or an attachment is missing rather than merely unstyled — describe the sender and the message, and never paste raw markup containing addresses or identifiers into a report.
Questions#
Is the original message altered?
No. Sanitising happens when the message is rendered, not when it is stored. The canonical record keeps what arrived, which is what an audit needs and what makes the provider's copy and Connect's copy agree.
Why not just show the message as the sender designed it?
Because a message is markup from a stranger, rendered inside an application holding a business's conversations. Losing a layout is a small cost; rendering hostile markup faithfully is not a cost anyone can bound in advance.
The layout is fine but the formatting of my own reply was lost — same thing?
No, that is the outbound side. The reply lost its formatting is the page for what happens to markup on the way out.