响应式邮件的编写插件介绍mjml

2020-12-07 15:19:00

参考地址 如何快速编写响应式电子邮件?

一、背景#


以前做项目碰到发邮件的需求,邮件模板的编辑就是一件头疼的事。因为虽说邮件是支持 HTML 的,但是确是 HTML 子集程度的支持,所以存在必须通过 <table> 排版的恶心之处,还有很多兼容性的坑。本质上是各家邮件商的标准有差异吧。

具体可参考阮一峰的这篇:http://www.ruanyifeng.com/blog/2013/06/html_email.html

于是我在网上 google 了下,发现了 mjml 这个最 hot 的 响应式电子邮件框架

二、特点#


1、那 mjml 就是一个类似 bootstrap 在 HTML + CSS 的地位,他们都提供了一些更高级的语法(标签)【叫MJML】,磨平了各家客户端在解析和指定标准上的差异。

2、mjml 的新语法学起来也很快,不多,好理解,易上手,然后基于组件化,能很快的搭出来你想要的 Email 内容。

3、mjml更支持响应式布局,且是移动端优先

三、使用#


1、安装#

其实有 npm 包,我懒得安装,遂用的在线编辑器

https://mjml.io/try-it-live

支持在线自动保存,很好用。

2、DEMO#

(1) 地址#

https://mjml.io/try-it-live/ry_x-1IZH

(2) 代码#
Copy<mjml>
  <mj-head>
    <mj-title>Hello Register</mj-title>
    <mj-attributes>
      <!-- 1、定义 global 样式 -->
      <!-- 针对某个元素 -->
      <mj-text line-height="150%" />
      <!-- 针对所有元素 -->
      <mj-all font-family="Arial" />
      <!-- 2、定义 class 样式 -->
      <mj-class name="title" font-size="35px" align="center" />
    </mj-attributes>
    <!-- 3、定义 css 样式 -->
    <mj-style inline="inline">
      .sign div { padding-left : 5px !important; color:#8C8C8C !important; }    </mj-style>
  </mj-head>
  <mj-body>
    <mj-wrapper background-url="https://i.loli.net/2019/07/14/5d2b00fad302f18835.png" background-repeat="no-repeat" background-size="100% 100%" padding="30px">
      <mj-section>
        <mj-column>
          <!-- 4、定义 inline 样式 -->
          <mj-image width="100px" src="https://mjml.io/documentation/images/logo.png"></mj-image>
        </mj-column>
      </mj-section>
      <mj-section>
        <mj-column>
          <mj-text mj-class="title">Register Success!</mj-text>
          <mj-spacer height="10px" />
          <mj-text>Dear [username],</mj-text>
          <mj-text>Thank you for the registration, you are welcomed to be our first tier users. Please click the link to activate your account:</mj-text>
          <mj-button href="http://www.google.com"> Activate </mj-button>
        </mj-column>
      </mj-section>
      <mj-section>
        <mj-column width="70%">
          <mj-social>
            <mj-social-element name="facebook" href="https://mjml.io/">
              Facebook            </mj-social-element>
            <mj-social-element name="google" href="https://mjml.io/">
              Google            </mj-social-element>
            <mj-social-element name="twitter" href="https://mjml.io/">
              Twitter            </mj-social-element>
          </mj-social>
        </mj-column>
        <mj-column width="30%">
          <mj-text css-class="sign">
            COPYRIGHT<br/> @2019          </mj-text>
        </mj-column>
      </mj-section>
    </mj-wrapper>
  </mj-body></mjml>
(3) 预览效果#

3、注意知识点#

(1) 一个最简的框架#
Copy<mjml>
  <mj-body>
  
    <mj-section>
      <mj-column>
        <!-- First column content -->
      </mj-column>
      <mj-column>
        <!-- Second column content -->
      </mj-column>
    </mj-section>
    
    <mj-section>  
     <mj-column> 
     		<!-- 即使只有一个 <mj-column>,也得在<mj-section>下 --> 
     </mj-column> 
    </mj-section>
    
  </mj-body></mjml>

包含关系:mjml > mj-body > mj-section > mj-column

mj-section 不能嵌套到 mj-section 中, mj-column 也不能嵌套到 mj-column 中。

(2) mj-group#

因为 mjml 是移动端优先,那么mj-group 允许您阻止 mj-column 在移动设备上堆叠。

(3) mj-spacer#

建议用 mj-spacer 代替 br 去换行

(4) mj-text#

原生的 html,例如 <b>qwe</b> 、<a href="#">click</a> ,建议放在 mj-text 里 ,否则不显示也不生效。

(5) mj-hero 和 mj-warpper 的区别#

mj-hero 只针对 mj-section下

而 mj-warpper 可以把多个 mj-section 包装在一起。实现跨 mj-section 共享边框或背景图像

坑:background-color 只能加到 mj-warpper 、mj-hero、 mj-section 等上面。

4、高级功能#

(1)除了有社区组件的提供,自己也可以创建组件

(2)支持 JSON 语法构建 Email。

(3)有丰富的插件系统,支持 VS、Atom、Sublime。


参考文献

官方文档:https://mjml.io/documentation/#sections


  • 2017-08-03 21:16:46

    Node.js 里面那些遗失的 ES6 特性

    其实 Node.js 对 ES6 的很多特性都已经开始支持了。 在 Node.js 使用的 JS 引擎 V8 里面将不同状态 ES6 特性分成了 3 个等级:

  • 2017-08-08 11:17:17

    nginx 反向代理 取得真实IP和域名

    nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递到应用程序中。

  • 2017-08-09 15:14:52

    如何写好.babelrc?Babel的presets和plugins配置解析

    官网是这么说的,翻译一下就是下一代JavaScript 语法的编译器。 作为前端开发,由于浏览器的版本和兼容性问题,很多JavaScript的新的方法都不能使用,等到可以大胆使用的时候,可能已经过去了好几年。Babel就因此而生,它可以让你放心使用大部分的JavaScript的新的标准的方法,然后编译成兼容绝大多数的主流浏览器的代码。

  • 2017-08-15 17:44:21

    glob 介绍

    glob 最早是出现在类Unix系统的命令行中, 是用来匹配文件路径的。比如,lib/**/*.js 匹配 lib 目录下所有的 js 文件。 除了在命令行中,我们在程序中也会有匹配文件路径的需求。于是,很多编程语言有了对 glob 的实现 ,如 Python 中的 glob 模块; php 中的 glob 方法。

  • 2017-08-16 08:45:41

    nodejs中流(stream)的理解

    这种方式是把文件内容全部读入内存,然后再写入文件,对于小型的文本文件,这没有多大问题,比如grunt-file-copy就是这样实现的。但是对于体积较大的二进制文件,比如音频、视频文件,动辄几个GB大小,如果使用这种方法,很容易使内存“爆仓”。理想的方法应该是读一部分,写一部分,不管文件有多大,只要时间允许,总会处理完成,这里就需要用到流的概念。