Technical
Why Every Newsletter Needs a Plain Text Version
I sent my first newsletter as HTML only. Half the recipients never saw it properly because their email client stripped the styling and left a broken mess of tags and misaligned text. Now every newsletter I send includes a plain text version. Here is why this matters.
The Problem
HTML emails look great in Gmail and Apple Mail. They look terrible or completely invisible in:
- Corporate email clients with strict security policies that strip all HTML
- Text-based email clients (Mutt, Alpine, some terminal clients)
- Screen readers used by visually impaired users
- Email clients with images disabled by default (most Outlook configurations)
- Older mobile email apps with limited rendering support
If you only send HTML, you are excluding a significant portion of your audience without even knowing it.
The Solution: Multipart MIME
Every email you send should include both HTML and plain text versions in a single message. The email client chooses which version to display based on its capabilities:
Content-Type: multipart/alternative
Part 1: text/plain (fallback for clients that cannot render HTML)
Part 2: text/html (preferred version for modern clients)The email client shows HTML if it can render it properly. If not, it falls back to the plain text version. Every recipient sees readable content.
Writing Good Plain Text
Plain text newsletters are not just HTML with the tags stripped out. They need their own formatting and structure to be readable:
PEAKLIGHT.AI NEWSLETTER -- April 2025
======================================
THIS MONTH'S ARTICLES
1. Why Simple Beats Clever
https://peaklight.ai/blog/why-simple-beats-clever
2. Getting Started with Claude Code
https://peaklight.ai/blog/getting-started-claude-code
--------------------------------------
WHAT I'M BUILDING
Working on a serverless blog platform that costs $0/month
to run on AWS free tier. Technical deep-dive coming next
month.
--------------------------------------
Unsubscribe: https://peaklight.ai/unsubscribe
peaklight.ai | Your AI SuperchargerKey Rules for Plain Text
- Use line breaks and separators:
---or===for visual section dividers - URLs on their own line: Make them easy to click or copy
- No markdown syntax: Not all email clients render it. Use plain formatting.
- Keep lines under 78 characters: Prevents awkward wrapping in narrow clients
- Include unsubscribe link: Required by CAN-SPAM law, must be functional
The CAN-SPAM Angle
CAN-SPAM compliance requires that recipients can read and act on your email. A broken HTML email with no plain text fallback is not just bad UX. It could be a compliance issue because the unsubscribe link might not be visible or clickable.
Implementation
When building your newsletter system, generate the plain text version alongside the HTML:
def create_newsletter_email(html_content: str, plain_text: str):
msg = MIMEMultipart('alternative')
msg.attach(MIMEText(plain_text, 'plain'))
msg.attach(MIMEText(html_content, 'html'))
return msgOr write the plain text version manually. It takes five minutes and ensures every single subscriber can read your content regardless of their email client.
See the CAN-SPAM Act compliance guide for full legal requirements.
RELATED READING
The Consulting Shift I Am Making In Year Two
After a year of writing and building, my consulting practice is changing shape. Shorter engagements. Sharper outcomes.
ReadThe Frontend Shift: Shipping Less JavaScript In Year Two
A year ago I reached for Next.js for everything. This year I often reach for nothing.
ReadThe Serverless Lesson I Would Write On A Sticky Note
After a year of shipping serverless projects, one rule explains most of the wins and all of the losses.
Read