如何创建响应式 html 电子邮件模板

How to created a responsive html email template

首先我知道很多人都问过这个问题,比如这两个问题:Building HTML emails .... and Can I put a ... tag .... 但我没有找到明确有效的答案 回答 !!还是我没看懂!!

我已经检查过 The Ultimate Guide to CSS 并且它说在 <head></head> 中使用 <style></style> 标签对于 gmail 和 yahoo 以及 @media 是可以的。但我的模板在 gmail 或 yahoo 中没有任何样式。我想发送响应式电子邮件,所以我需要 @media 还有什么方法可以在电子邮件中使用 :nth()

我把代码片段放在下面,如果有人帮助我,我真的很感激! 我用 putsmail 在 gmail 和 yahoo 邮件上测试它。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Order</title>
<meta name="viewport" content="width=device-width, initial-scale=1">

<style type="text/css">
/**
* Avoid browser level font resizing.
* 1. Windows Mobile
* 2. iOS / OSX
*/
body,
table,
td,
a {
    -ms-text-size-adjust: 100%; /* 1 */
    -webkit-text-size-adjust: 100%; /* 2 */
}

/**
* Remove extra space added to tables and cells in Outlook.
*/
table,
td {
    mso-table-rspace: 0pt;
    mso-table-lspace: 0pt;
}

/**
* Better fluid images in Internet Explorer.
*/
img {
    -ms-interpolation-mode: bicubic;
}

/**
* Remove blue links for iOS devices.
*/
a[x-apple-data-detectors] {
    font-family: inherit !important;
    font-size: inherit !important;
    font-weight: inherit !important;
    line-height: inherit !important;
    color: inherit !important;
    text-decoration: none !important;
}

/**
* Fix centering issues in Android 4.4.
*/
div[style*="margin: 16px 0;"] {
    margin: 0 !important;
}

body {
    max-width: 1100px !important;
    height: 100% !important;
    margin: 0 auto !important;
    font-family: Tahoma;
    background-color: #f7f7f7;
    padding: 20px;
}

.rtl{
    direction: rtl;
}
.ltr{
    direction: ltr;
}

/**
* Collapse table borders to avoid space between cells.
*/
/* table {
    border-collapse: collapse !important;
} */

a {
    color: #1a82e2;
}

img {
    height: auto;
    line-height: 100%;
    text-decoration: none;
    border: 0;
    outline: none;
}

p{
    margin: 0px;
}
.main-padding{
    padding: 20px;
}
.main_table{
    background-color: #fff;
    border: 1px solid #dddddd;
}
.header_section{
    width: 100%;
    color: #1a1b41;
    border-bottom: 3px solid #ffc107;
    font-size: 12px;
}
.title_section{
    width: 100%;
    color: #1a1b41;
    border: 3px solid #1a1b41;
    font-size: 15px;
    text-align: center;
    padding: 12px;
    text-transform: uppercase;
    letter-spacing: 1px;
}
.status_section{
    width: 100%;
    color: #fff;
    border-radius: 4px;
    padding: 10px;
}
.status_section--success{
    background-color: #28a745;
}
.status_section--fail{
    background-color: #dc3545;
}
.status_section .icon_wrapper{
    width: 62px;
    height: 62px;
    border-radius: 50%;
    background-color: rgba(255, 255, 255, 0.16);
}
.status_section .icon{
    width: 26px;
    margin: 18px;
}
.items_section_wrapper{
    width: 60%;
    padding: 10px 20px;
    vertical-align: top;
}
.items_section{
    width: 100%;
    margin-bottom: 20px;
}
.items_section .avatar{
    width: 40px;
    height: 40px;
    border-radius: 50%;
}
.items_section .info{
    padding: 0px 8px;
}
.items_section .info .title{
    margin-bottom: 2px;
    text-align: start;
    font-size: 14px;
    color: #1a1b41;
    font-weight: 700;
}
.items_section .info .location{
    text-align: start;
    font-size: 12px;
    color: #505050;
}
.items_section .card{
    background-color: #e4e4e4;
    padding: 4px;
    border-radius: 4px;
}
.items_section .card .image{
    vertical-align: top;
    width: 20%;
}
.items_section .card img{
    display: block !important;
    width: 100% !important;
    height: auto !important;
    border-radius: 15px;
    box-shadow: 0px 2px 5px #a5a5a5;
}
.items_section .card .info_wrapper{
    vertical-align: top;
}
.items_section .card .title{
    font-size: 14px;
    color: #000;
    padding: 8px;
}
.items_section .card .price{
    padding: 8px;
    font-size: 18px;
    color: #000;
}
.items_section .card .price{
    padding: 8px;
    font-size: 18px;
    color: #000;
}
.items_section .card .price-total{
    padding: 8px 0;
    font-size: 18px;
    color: #000;
    font-weight: 800;
    text-align: end;
}
.items_section .card .sign{
    padding: 0 4px;
    font-size: 16px;
    color: #505050;
    font-weight: 800;
}
.items_section .card .number{
    font-size: 18px;
    color: #000;
    font-weight: 800;
}
.items_section .card .attr{
    padding: 0px 8px;
}
.items_section .card .dot{
    color: #ff3366;
    font-size: 16px;
}
.rtl .items_section .card .value{
    color: #1a1b41;
    font-size: 12px;
    margin-bottom: 4px;
    width: 50%;
    font-weight: 800;
    float: right;
}
.ltr .items_section .card .value{
    color: #1a1b41;
    font-size: 12px;
    margin-bottom: 4px;
    width: 50%;
    font-weight: 800;
    float: left;
}
.items_section .shipping_wrapper{
    width: 100%;
    font-size: 12px;
    font-weight: 700;
}
.items_section .shipping_wrapper .icon{
    width: 20px;
}
.details_wrapper{
    width: 100%;
}
.total_recipient_table-side{
    padding: 10px 20px;
    vertical-align: top;
}
.total_recipient_table-bottom{
    display: none;
}
.detail_table{
    width: 100%;
    box-shadow: 0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%);
    border-radius: 4px;
    border-spacing: 0;
}
.detail_table .header{
    font-size: 16px;
    font-weight: 700;
    text-align: start;
    padding: 8px;
    box-shadow: 0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%);
}
.detail_table .rows:nth-child(even){
    background-color: #eee;
}
.detail_table .rows .title{
    font-size: 12px;
    font-weight: 700;
    padding: 8px;
    text-align: start;
    min-width: 100px;
}
.detail_table .rows .text{
    font-size: 12px;
    font-weight: 700;
    padding: 8px;
    text-align: end;
}
.btns_section{
    width: 100%;
}
.btns_section .btn_wrapper{
    display: flex;
    flex-wrap: wrap;
}
.btns_section button{
    font-size: 13px;
    padding: 8px;
    min-width: 100px;
    color: #fff;
    text-transform: uppercase;
    border: none;
    margin: 4px;
}
.btns_section button:hover{
    cursor: pointer;
}
.btns_section button:focus{
    outline: none;
}
.btn_s{
    background-color: #28a745;
}
.btn_d{
    background-color: #dc3545;
}
.btn_w{
    background-color: #ffc107;
}
.btn_i{
    background-color: #17a2b8;
}
.action_section button{
    background-color: #ffc107;
    font-size: 15px;
    padding: 10px;
    min-width: 150px;
    color: #fff;
    text-transform: uppercase;
    border: none;
}
.action_section button:hover{
    background-color: #ffc107ee;
    cursor: pointer;
}
.action_section button:focus{
    background-color: #ffc107ee;
    outline: none;
}
.footer_section{
    width: 100%;
    border-top: 3px solid #757575;
}
.footer_section td{
    font-size: 10px;
    text-align: center;
    color: #1a1b41;
}
.footer_section a{
    text-decoration: none;
    color: #1a1b41;
}
.footer_section a:hover{
    color: #ffc107;
}
.mobile{
    display: none;
}
@media (max-device-width: 767px),
 (max-width: 767px) {
    body{
        padding: 5px;
    }
    .main-padding{
        padding: 10px 5px;
    }
    .items_section_wrapper{
        width: 100%;
        padding: 10px 5px;
    }
    .items_section .card .image{
        width: 25%;
    }
    .items_section .card img{
        border-radius: 4px;
    }
    .items_section .card .attr{
        padding: 8px 0 0;
    }
    .items_section .card .price{
        padding: 8px 0 0;
        font-size: 16px;
    }
    .ltr .items_section .card .price{
        float: left;
    }
    .rtl .items_section .card .price{
        float: right;
    }
    .items_section .card .price-total{
        padding: 8px 0 0;
        font-size: 16px;
    }
    .items_section .card .sign{
        padding: 0 4px;
        font-size: 14px;
    }
    .items_section .card .number{
        font-size: 16px;
    }
    .total_recipient_table-side{
        display: none;
    }
    .total_recipient_table-bottom{
        display: table-row;
    }
    .desktop{
        display: none;
    }
    .mobile{
        display: table;
    }
}
</style>

</head>
<!-- ltr / rlt -->
<body class="ltr">

    <!-- start preheader -->
    <div class="preheader" style="display: none; max-width: 0; max-height: 0; overflow: hidden; font-size: 1px; line-height: 1px; color: #fff; opacity: 0;">
        <!-- A preheader is the short summary text that follows the subject line when an email is viewed in the inbox. -->
        Your Order submitted
    </div>
    <!-- end preheader -->

    <!-- start body -->
    <table border="0" cellpadding="0" cellspacing="0" width="100%" class="main_table">
        <tr>
            <td align="center" class="main-padding">
                <table class="header_section">
                    <tr>
                        <td>
                            Example.com
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
        <tr>
            <td align="center" class="main-padding">
                <table class="title_section">
                    <tr>
                        <td>
                            Your <span style="color: #ffc107;">Order</span>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            Thanks for choosing us!
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
        <tr>
            <td align="center" class="main-padding">
                <!-- for failed change status_section--success to status_section--fail ALSO img src to times-circle-solid.png -->
                <table class="status_section status_section--success">
                    <tr>
                        <td style="width:70px;">
                            <div class="icon_wrapper">
                                <img class="icon" src="check-circle-solid.png">
                            </div>
                        </td>
                        <td style="font-weight: 700;font-size: 14px;">
                            payment was successful<span> - your invoice code: </span><span>1235789</span>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
        <tr>
            <td>
                <table style="width: 100%;">
                    <tr>
                        <td class="items_section_wrapper">
                            <table class="items_section">
                                <tr class="vendor">
                                    <td style="width: 40px;">
                                        <img src="1.jpg" class="avatar">
                                    </td>
                                    <td class="info">
                                        <p class="title">Vendor Name</p>
                                        <p class="location">location</p>
                                    </td>
                                </tr>
                                <tr>
                                    <td colspan="2" class="card">
                                        <table style="width: 100%; border-spacing: 0;">
                                            <tr>
                                                <td class="image">
                                                    <img src="1.jpg">
                                                </td>
                                                <td class="info_wrapper">
                                                    <table style="width: 100%;">
                                                        <tr>
                                                            <td class="title" colspan="2">Lorem Ipsum</td>
                                                        </tr>
                                                        <tr class="desktop">
                                                            <td colspan="2" class="attr">
                                                                <p class="value"><span class="dot">&bull; </span>color: red</p>
                                                            </td>
                                                        </tr>
                                                        <tr class="desktop">
                                                            <td class="price">12 $<span class="sign">&times;</span><span class="number">10</span></td>
                                                            <td class="price-total">120 $</td>
                                                        </tr>
                                                    </table>
                                                </td>
                                            </tr>
                                            <tr>
                                                <td colspan="2">
                                                    <table style="width: 100%;" class="mobile">
                                                        <tr>
                                                            <td class="attr" colspan="1">
                                                                <p class="value"><span class="dot">&bull; </span>color: red</p>
                                                            </td>
                                                        </tr>
                                                        <tr>
                                                            <td>
                                                                <p class="price">12 $<span class="sign">&times;</span><span class="number">10</span></p>
                                                                <p class="price-total">120 $</p>
                                                            </td>
                                                        </tr>
                                                    </table>
                                                </td>
                                            </tr>
                                        </table>
                                    </td>
                                </tr>
                                <tr>
                                    <td colspan="2">
                                        <table class="shipping_wrapper">
                                            <tr>
                                                <td style="width: 24px;">
                                                    <img src="truck-solid.png" class="icon">
                                                </td>
                                                <td>shipping</td>
                                                <td style="text-align: end;">20 $</td>
                                            </tr>
                                        </table>
                                    </td>
                                </tr>
                            </table>
                        </td>
                        <td class="total_recipient_table-side">
                            <table class="details_wrapper">
                                <tr>
                                    <td style="padding-bottom:24px;">
                                        <table class="detail_table">
                                            <tr>
                                                <td class="header" colspan="2">calc</td>
                                            </tr>
                                            <tr class="rows">
                                                <td class="title">Items</td>
                                                <td class="text">120 $</td>
                                            </tr>
                                            <tr class="rows">
                                                <td class="title">Tax Fee</td>
                                                <td class="text">10 $</td>
                                            </tr>
                                            <tr class="rows">
                                                <td class="title">Shipping</td>
                                                <td class="text">20 $</td>
                                            </tr>
                                            <tr class="rows">
                                                <td class="title">Total</td>
                                                <td class="text">150 $</td>
                                            </tr>
                                        </table>
                                    </td>
                                </tr>
                                <tr>
                                    <td>
                                        <table class="detail_table">
                                            <tr>
                                                <td class="header" colspan="2">recipient</td>
                                            </tr>
                                            <tr class="rows">
                                                <td class="title">full name</td>
                                                <td class="text">John Doe</td>
                                            </tr>
                                            <tr class="rows">
                                                <td class="title">email</td>
                                                <td class="text">jdoe@example.com</td>
                                            </tr>
                                            <tr class="rows">
                                                <td class="title">phone</td>
                                                <td class="text">00000000000</td>
                                            </tr>
                                            <tr class="rows">
                                                <td class="title">address</td>
                                                <td class="text">.............</td>
                                            </tr>
                                        </table>
                                    </td>
                                </tr>
                            </table>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
        <tr class="total_recipient_table-bottom">
            <td class="main-padding">
                <table class="details_wrapper">
                    <tr>
                        <td style="padding-bottom:24px;">
                            <table class="detail_table">
                                <tr>
                                    <td class="header" colspan="2">calc</td>
                                </tr>
                                <tr class="rows">
                                    <td class="title">Items</td>
                                    <td class="text">120 $</td>
                                </tr>
                                <tr class="rows">
                                    <td class="title">Tax Fee</td>
                                    <td class="text">10 $</td>
                                </tr>
                                <tr class="rows">
                                    <td class="title">Shipping</td>
                                    <td class="text">20 $</td>
                                </tr>
                                <tr class="rows">
                                    <td class="title">Total</td>
                                    <td class="text">150 $</td>
                                </tr>
                            </table>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <table class="detail_table">
                                <tr>
                                    <td class="header" colspan="2">recipient</td>
                                </tr>
                                <tr class="rows">
                                    <td class="title">full name</td>
                                    <td class="text">John Doe</td>
                                </tr>
                                <tr class="rows">
                                    <td class="title">email</td>
                                    <td class="text">jdoe@example.com</td>
                                </tr>
                                <tr class="rows">
                                    <td class="title">phone</td>
                                    <td class="text">00000000000</td>
                                </tr>
                                <tr class="rows">
                                    <td class="title">address</td>
                                    <td class="text">.............</td>
                                </tr>
                            </table>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
        <tr>
            <td align="center" class="main-padding">
                <table class="btns_section">
                    <tr>
                        <td class="btn_wrapper">
                            <a href="#"><button class="btn_s">Accept</button></a>
                            <a href="#"><button class="btn_d">Delete</button></a>
                            <a href="#"><button class="btn_w">Reject</button></a>
                            <a href="#"><button class="btn_i">Pend</button></a>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
        <tr>
            <td align="center" class="main-padding" style="padding-top: 40px;padding-bottom: 40px;">
                <table class="action_section">
                    <tr>
                        <td>
                            <a href="#"><button>Button</button></a>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
        <tr>
            <td align="center" class="main-padding">
                <table class="footer_section">
                    <tr>
                        <td>
                            Copyright &#169; 2020 example.com All rights reserved | <span><a href="#">Home</a></span> | <span><a href="#">Contact Us</a></span> |
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
    <!-- end body -->

</body>
</html>

您在这里遇到了两个不同的电子邮件错误,一个在 Gmail 中,另一个在 Yahoo 中。这是发生了什么以及如何解决它。

1。 Gmail

Gmail 对某些样式非常挑剔。每当 Gmail 发现它不喜欢的内容时,Gmail 就会删除包含有问题样式的整个 <style> 标签。你可以read more about how Gmail removes styles that include special characters here。为了找出您的代码有什么问题,我将您的一个且唯一的 <style> 标记拆分为多个。然后我给自己发了邮件并检查了 Gmail 中的代码,并查看了 Gmail 保留的内容。然后我得出结论,Gmail 不喜欢您的代码的是 box-shadow 声明和 / 语法。

.detail_table{
    width: 100%;
    box-shadow: 0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%);
    border-radius: 4px;
    border-spacing: 0;
}
.detail_table .header{
    font-size: 16px;
    font-weight: 700;
    text-align: start;
    padding: 8px;
    box-shadow: 0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%);
}

这里的解决方案只是将有问题的样式隔离在它们自己的 <style> 标记中。因此,从巨大的 <style> 标签中删除两个 box-shadow 声明,并添加第二个 <style> 标签,仅包含以下内容:

.detail_table{
    box-shadow: 0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%);
}
.detail_table .header{
    box-shadow: 0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%);
}

2。雅虎

我假设您正在 Yahoo Android 上进行测试。在 Android,雅虎从 <head> 标签中删除了内容。 (您可以 read more about this here。)但它只对电子邮件中的第一个 <head> 标签这样做。我知道您在想什么,HTML 通常只有一个 <head> 元素。但事实证明我们可以添加第二个 <head> 标签,雅虎会将内容保留在第二个 <head> 中。因此,要让响应式电子邮件在 Yahoo Android 上正常工作,一般做法是先添加一个空的 <head> 标签,然后再添加一个包含所有内容的真实 <head>。令人惊讶的是,这在电子邮件客户端和渲染引擎中得到了很好的支持。这是一个例子:

!DOCTYPE html>
<html>
<head></head>
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <title>Order</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <style type="text/css">
    /**
    * Avoid browser level font resizing.
    * 1. Windows Mobile
    * 2. iOS / OSX
    */
    body,
    table,
    td,
    a {
        …
    }
    </style>
</head>
<body>
…
</body>
</html>

另请注意,雅虎 a bug with CSS comments 并且在发送电子邮件之前删除所有 CSS 评论通常是一个好习惯。