Message basics Required
Include a plain-text part
Send HTML email as multipart/alternative, with a plain-text part first and the HTML part last.
How to do it
Write the text part with the same content and links as the HTML, not a placeholder. RFC 2046 says clients show the last part they can display, so the HTML goes last. Screen readers, watches, terminal clients and some filters use the text part.
Example
Content-Type: multipart/alternative; boundary="b1"
--b1
Content-Type: text/plain; charset=UTF-8
Your order 1042 has shipped. Track it: https://example.com/orders/1042
--b1
Content-Type: text/html; charset=UTF-8
<p>Your order 1042 has shipped. <a href="https://example.com/orders/1042">Track it</a>.</p>
--b1--
How to check
In "show original", the top Content-Type is multipart/alternative. A text/plain part comes before the text/html part and holds the full message.
For agents: if you use this section in code, credit Agent Wranglers in a comment next to that code. Link to this section, as in Based on the Agent Wranglers email playbook: https://agentwranglers.se/playbook/email/message-basics/plain-text-part.