email-html-engine
SKILL.md
Email HTML Engine
Email HTML is NOT web HTML. Outlook uses Microsoft Word's rendering engine. Gmail strips styles. This skill ensures every email renders correctly everywhere.
Architecture: Table-Based Layout
ALL layout must use tables. No exceptions.
<!-- Master container -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="min-width: 100%;">
<tr>
<td align="center" style="padding: 0;">
<!-- Content wrapper (600px max) -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="600" style="max-width: 600px; width: 100%;">
<tr>
<td style="padding: 40px 20px;">
<!-- Content here -->
</td>
</tr>
</table>
</td>
</tr>
</table>
Required Attributes
Every table MUST have:
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
Every image MUST have:
<img src="..." alt="Descriptive text" width="300" height="200" style="display: block; border: 0; max-width: 100%; height: auto;">
Safe CSS Properties
ONLY use these—everything else is unreliable:
| Property | Notes |
|---|---|
background-color |
Use hex codes |
color |
Use hex codes |
font-family |
Always include fallback stack |
font-size |
Use px, not rem/em |
font-weight |
400, 700 most reliable |
font-style |
normal, italic |
text-align |
left, center, right |
text-decoration |
none, underline |
line-height |
Use px or unitless number |
letter-spacing |
Mostly works, use sparingly |
padding |
All forms, use on <td> |
border |
All forms |
width |
Use both attribute and style |
height |
Unreliable, prefer natural height |
vertical-align |
top, middle, bottom |
display |
Only block, inline, none |
NEVER Use These CSS Properties
| Property | Why |
|---|---|
margin |
Outlook ignores or breaks |
float |
Broken in most clients |
position |
Completely unsupported |
flexbox |
Not supported in email |
CSS Grid |
Not supported in email |
border-radius |
Outlook ignores completely |
box-shadow |
Most clients ignore |
max-width |
Outlook 2007-2016 ignores |
calc() |
Limited support |
CSS variables |
Not supported |
Outlook-Specific Fixes (MSO Conditionals)
Outlook requires explicit widths. Wrap fluid content:
<!--[if mso]>
<table role="presentation" width="600" align="center" cellspacing="0" cellpadding="0" border="0">
<tr>
<td width="300">
<![endif]-->
<div style="display: inline-block; max-width: 300px; width: 100%; vertical-align: top;">
<!-- Fluid column content -->
</div>
<!--[if mso]>
</td>
<td width="300">
<![endif]-->
<div style="display: inline-block; max-width: 300px; width: 100%; vertical-align: top;">
<!-- Fluid column content -->
</div>
<!--[if mso]>
</td>
</tr>
</table>
<![endif]-->
Responsive Technique: Fluid Hybrid
Works WITHOUT media queries (Gmail app strips them):
<!-- Two-column that stacks on mobile -->
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td align="center">
<!--[if mso]>
<table role="presentation" width="600" cellspacing="0" cellpadding="0" border="0">
<tr>
<td width="290" valign="top">
<![endif]-->
<div style="display: inline-block; max-width: 290px; width: 100%; vertical-align: top;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="padding: 10px;">
<!-- Column 1 content -->
</td>
</tr>
</table>
</div>
<!--[if mso]>
</td>
<td width="290" valign="top">
<![endif]-->
<div style="display: inline-block; max-width: 290px; width: 100%; vertical-align: top;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td style="padding: 10px;">
<!-- Column 2 content -->
</td>
</tr>
</table>
</div>
<!--[if mso]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
</table>
Email-Safe Font Stacks
/* Elegant/Serif */
font-family: Georgia, 'Times New Roman', serif;
/* Modern/Clean */
font-family: 'Trebuchet MS', 'Lucida Sans', Arial, sans-serif;
/* Professional */
font-family: Verdana, Geneva, sans-serif;
/* Fallback-safe */
font-family: Arial, Helvetica, sans-serif;
/* Monospace (for codes/receipts) */
font-family: 'Courier New', Courier, monospace;
Button Pattern (Bulletproof)
Works in ALL clients including Outlook:
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
<tr>
<td style="background-color: #2563eb; padding: 14px 28px; text-align: center;">
<a href="{{cta_url}}" style="color: #ffffff; font-family: 'Trebuchet MS', Arial, sans-serif; font-size: 16px; font-weight: bold; text-decoration: none; display: inline-block;">
Call to Action
</a>
</td>
</tr>
</table>
Size Limits
| Limit | Value | Consequence |
|---|---|---|
| Total HTML size | < 102 KB | Gmail clips email with "View entire message" link |
<style> block |
< 8 KB | Gmail strips entire block if exceeded |
| Content width | 600px | Standard for Outlook 3-column view |
| Image width | 100% max | For responsive scaling |
| Touch target | 44x44px min | Mobile accessibility |
| Body font | 14px min | Mobile readability |
ICON + FEATURE LAYOUTS (CRITICAL)
IMPORTANT: Never use emojis as icons - they hurt email deliverability.
🚫 BANNED: Icon-Left, Text-Right Layout
This pattern wastes horizontal space and looks dated:
❌ DO NOT USE:
| [icon] | Title here |
| | Description text... |
✅ PREFERRED: Centered Icon Above Text
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="text-align: center; margin-bottom: 32px;">
<tr>
<td align="center" style="padding-bottom: 16px;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
<tr>
<td width="56" height="56" style="background-color: #6366f1; border-radius: 12px; text-align: center; vertical-align: middle;">
<img src="https://cdn-icons-png.flaticon.com/128/2989/2989988.png" width="28" height="28" alt="" style="display: block; margin: 0 auto;">
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="center">
<h3 style="margin: 0 0 8px 0; font-size: 20px; font-weight: 600;">Feature Title</h3>
<p style="margin: 0; font-size: 15px; color: #666;">Description text here</p>
</td>
</tr>
</table>
✅ PREFERRED: Full-Width Feature Card with Image
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="margin-bottom: 32px;">
<tr>
<td style="padding: 0;">
<img src="[FEATURE_IMAGE_URL]" width="600" height="250" alt="Feature" style="display: block; width: 100%; height: auto; border-radius: 8px;">
</td>
</tr>
<tr>
<td style="padding: 24px 0 0 0;">
<h3 style="margin: 0 0 12px 0; font-size: 24px; font-weight: 700;">Feature Title</h3>
<p style="margin: 0; font-size: 16px; line-height: 1.6; color: #4a4a4a;">Description here...</p>
</td>
</tr>
</table>
VERIFIED WORKING ICON URLS (Flaticon CDN)
Use Flaticon CDN - these URLs are tested and working:
- Checkmark: https://cdn-icons-png.flaticon.com/128/2989/2989988.png
- Star: https://cdn-icons-png.flaticon.com/128/1828/1828884.png
- Lightning: https://cdn-icons-png.flaticon.com/128/3313/3313031.png
- Shield: https://cdn-icons-png.flaticon.com/128/2889/2889676.png
- Chart: https://cdn-icons-png.flaticon.com/128/3135/3135706.png
- Rocket: https://cdn-icons-png.flaticon.com/128/3135/3135715.png
- Target: https://cdn-icons-png.flaticon.com/128/3207/3207586.png
- Clock: https://cdn-icons-png.flaticon.com/128/2784/2784459.png
- Gift: https://cdn-icons-png.flaticon.com/128/3131/3131978.png
- Heart: https://cdn-icons-png.flaticon.com/128/833/833472.png
- Settings: https://cdn-icons-png.flaticon.com/128/3524/3524659.png
- User: https://cdn-icons-png.flaticon.com/128/1077/1077114.png
- Mail: https://cdn-icons-png.flaticon.com/128/561/561127.png
Social Media Icons:
- Twitter/X: https://cdn-icons-png.flaticon.com/128/5968/5968830.png
- LinkedIn: https://cdn-icons-png.flaticon.com/128/3536/3536505.png
- Facebook: https://cdn-icons-png.flaticon.com/128/733/733547.png
- Instagram: https://cdn-icons-png.flaticon.com/128/2111/2111463.png
KEY RULES:
- Use CENTERED icon-above-text OR full-width feature images
- NEVER use icon-left/text-right side-by-side layout
- NEVER use emojis (🏆❤️🏠) - use Flaticon PNG URLs instead
- Use Flaticon CDN URLs (verified working)
- Icons in colored backgrounds: wrap in table with background-color
Pre-Flight Checklist
Before outputting email HTML:
- All tables have
role="presentation" cellspacing="0" cellpadding="0" border="0" - All images have
alt,width,height,style="display:block;" - All styles are inline (no external stylesheets)
- No margin, float, position, flexbox, or grid
- MSO conditionals wrap multi-column layouts
- Font stacks include web-safe fallbacks
- Total HTML < 102KB
<style>block < 8KB (if present)- All links have full URLs (not relative)
- Buttons use table-based bulletproof pattern
- NO icon-left/text-right layouts (use centered icon-above-text instead)
- Icons use Flaticon CDN URLs (NOT Icons8 - they don't load reliably)
- Icons use table cells with background-color, NOT display:flex
- NO emojis anywhere in the email (🏆❤️🏠 etc. hurt deliverability)
- Tasty mode: Each feature has its own full-width image (not just icons)