The Rendering Landscape
Each email client uses a different rendering engine, which means different levels of CSS and HTML support:| Client | Rendering Engine | CSS Support |
|---|---|---|
| Gmail (web) | Custom (strips <style> blocks, inlines CSS) | Limited — no <style> in <head>, no media queries |
| Gmail (mobile app) | WebKit | Better than web — supports some media queries |
| Outlook 2019/2021/365 (desktop) | Microsoft Word | Very limited — no background-image, broken float, poor margin/padding |
| Outlook.com (web) | Custom | Moderate — better than desktop Outlook |
| Apple Mail | WebKit | Excellent — closest to a web browser |
| Yahoo Mail | Custom | Moderate — strips some CSS properties |
| Thunderbird | Gecko | Good — similar to Firefox |
Broken Layouts
Tables vs CSS Layout
Modern web development uses CSS Grid and Flexbox, but email requires table-based layouts for consistent rendering across clients — especially Outlook desktop.Common Layout Breakages
Columns stacking or overlapping in Outlook
Columns stacking or overlapping in Outlook
Outlook desktop ignores
display: flex, display: grid, and float in many contexts.Fix: Use <table> elements with explicit width attributes (in pixels or percentages) for column layouts. Set role="presentation" on layout tables for accessibility.Email is wider than expected
Email is wider than expected
Missing width constraints cause the email to stretch to the full viewport.Fix: Wrap your entire email in a container table with a fixed
max-width:Spacing is inconsistent across clients
Spacing is inconsistent across clients
Different clients handle
margin and padding differently, especially on <p> and <div> elements.Fix: Use padding on <td> elements instead of margin on block elements. Reset default margins on <p> tags:Responsive design not working in Gmail web
Responsive design not working in Gmail web
Gmail’s web client strips
<style> blocks from the <head>, which removes media queries.Fix: Use inline styles as the default (mobile-first) and rely on media queries only as a progressive enhancement for clients that support them. Design your single-column mobile layout as the base.Missing or Broken Images
Common Causes
| Problem | Cause | Fix |
|---|---|---|
| Images not loading | Blocked by client (Outlook blocks by default) | Always include alt text as a fallback |
| Broken image icon | Incorrect src URL or expired link | Use absolute URLs hosted on a reliable CDN |
| Images clipped or distorted | Missing width/height attributes | Always set both width and height on <img> tags |
| Retina images blurry | Image served at 1x resolution | Use 2x resolution images with explicit width/height at the display size |
| CID images not displaying | Inline attachments not supported by all clients | Use hosted URLs instead of CID references |
Best Practices for Email Images
Images Blocked by Default
Some email clients block images by default until the recipient clicks “Load images”:- Outlook desktop — blocks external images by default
- Thunderbird — blocks remote content by default
- Some corporate email systems — strip or block images for security
alt text, background colors as fallbacks, and ensure key information is in HTML text, not baked into images.
Font Rendering Issues
Email clients have very limited web font support. Most clients fall back to system fonts.Web Font Support
| Client | Web Fonts (@font-face) |
|---|---|
| Apple Mail | Supported |
| iOS Mail | Supported |
| Outlook (all versions) | Not supported |
| Gmail (web and app) | Not supported |
| Yahoo Mail | Not supported |
| Thunderbird | Supported |
Font Fallback Stack
Always define a fallback stack. Your web font (if used) should be first, followed by system fonts:Since most recipients will see a system font, design and test with system fonts as the primary experience. Treat web fonts as a progressive enhancement.
Gmail Message Clipping
Gmail clips (truncates) emails that exceed approximately 102 KB of HTML content. When clipped, Gmail shows a “[Message clipped] View entire message” link at the bottom.Why Clipping Matters
- Recipients may miss important content below the fold (like unsubscribe links)
- The “View entire message” link opens the email in a new window, which many recipients won’t click
- Tracking pixels placed at the bottom of clipped emails won’t fire, reducing open rate accuracy
How to Avoid Clipping
- Minimize HTML size — remove unnecessary whitespace, comments, and redundant inline styles.
- Avoid duplicated CSS — some email builders inline the same styles on every element, inflating file size.
- Use efficient markup — simplify nested tables and remove empty elements.
- Check the size before sending — your HTML should be well under 102 KB.
Dark Mode Rendering
Dark mode inverts colors in email clients, which can break designs that aren’t prepared for it. See Dark Mode Email Design for a dedicated guide on this topic.Quick Fixes
- Add
color-scheme: light dark;and-webkit-color-scheme: light dark;to your email’s root element to signal dark mode awareness. - Use transparent PNGs for logos instead of JPGs with white backgrounds.
- Avoid pure white (
#ffffff) backgrounds — use a very slight off-white (#fefefe) that won’t get inverted.
Testing Across Clients
There is no substitute for testing your emails in multiple clients before sending.Manual Testing Checklist
Test in the major clients
Test in the major clients
At minimum, test in:
- Gmail (web and mobile)
- Outlook desktop (2019/2021/365)
- Outlook.com (web)
- Apple Mail (macOS and iOS)
Test with images on and off
Test with images on and off
View your email with images loaded and with images blocked. Verify that alt text displays properly and the email is still readable.
Test at different widths
Test at different widths
View your email at desktop (600px content width) and mobile (320px viewport) sizes. Verify that responsive breakpoints work correctly.
Test in dark mode
Test in dark mode
Toggle dark mode in Gmail, Outlook, and Apple Mail. Check for invisible text, missing logos, and broken backgrounds.
Check the HTML file size
Check the HTML file size
Verify the compiled HTML is under 80 KB to avoid Gmail clipping. Check for unnecessary inline styles or deeply nested tables inflating the size.
Validate links and tracking
Validate links and tracking
Click every link in the email. Verify tracking links resolve correctly and don’t trigger browser security warnings.