Mjml - the only framework that makes responsive-email easy

Overview

MJML 4

If you're looking for MJML 3.3.X check this branch

github actions

| Translated documentation | Introduction | Installation | Usage |


Translated documentation

Language Link for documentation
日本語 日本語ドキュメント

Introduction

MJML is a markup language created by Mailjet and designed to reduce the pain of coding a responsive email. Its semantic syntax makes the language easy and straightforward while its rich standard components library shortens your development time and lightens your email codebase. MJML’s open-source engine takes care of translating the MJML you wrote into responsive HTML.

Installation

You can install MJML with NPM to use it with NodeJS or the Command Line Interface. If you're not sure what those are, head over to Usage for other ways to use MJML.

npm install mjml

Development

To work on MJML, make changes and create merge requests, download and install yarn for easy development.

git clone https://github.com/mjmlio/mjml.git && cd mjml
yarn
yarn build

You can also run yarn build:watch to rebuild the package as you code.

Usage

Online

Don't want to install anything? Use the free online editor!

try it live


Applications and plugins

MJML comes with an ecosystem of tools and plugins, check out:

For more tools, check the Community page.

Command line interface

Compiles the file and outputs the HTML generated in output.html

mjml input.mjml -o output.html

You can pass optional arguments to the CLI and combine them.

argument description default value
mjml -m [input] Migrates a v3 MJML file to the v4 syntax NA
mjml [input] -o [output] Writes the output to [output] NA
mjml [input] -s Writes the output to stdout NA
mjml -w [input] Watches the changes made to [input] (file or folder) NA
mjml [input] --config.beautify Beautifies the output (true or false) true
mjml [input] --config.minify Minifies the output (true or false) false

See mjml-cli documentation for more information about config options.

Inside Node.js

import mjml2html from 'mjml'

/*
  Compile an mjml string
*/
const htmlOutput = mjml2html(`
  
   
    
   
      
   
        
   
          
   
            Hello World!
          
        
      
    
  
`, options)


/*
  Print the responsive HTML generated and MJML errors if any
*/
console.log(htmlOutput)

You can pass optional options as an object to the mjml2html function:

option unit description default value
fonts object Default fonts imported in the HTML rendered by HTML See in index.js
keepComments boolean Option to keep comments in the HTML output true
ignoreIncludes boolean Option to ignore mj-includes false
beautify boolean Option to beautify the HTML output false
minify boolean Option to minify the HTML output false
validationLevel string Available values for the validator: 'strict', 'soft', 'skip' 'soft'
filePath string Path of file, used for relative paths in mj-includes '.'
preprocessors array of functions Preprocessors applied to the xml before parsing. Input must be xml, not json. Functions must be (xml: string) => string []
juicePreserveTags Preserve some tags when inlining css, see mjml-cli documentation for more info NA
minifyOptions Options for html minifier, see mjml-cli documentation for more info NA
mjmlConfigPath string The path or directory of the .mjmlconfig file (for custom components use) process.cwd()
useMjmlConfigOptions Allows to use the config attribute from .mjmlconfig file false

Client-side (in browser)

var mjml2html = require('mjml-browser')

/*
  Compile a mjml string
*/
var htmlOutput = mjml2html(`
  
   
    
   
      
   
        
   
          
   
            Hello World!
          
        
      
    
  
`, options)


/*
  Print the responsive HTML generated and MJML errors if any
*/
console.log(htmlOutput)

API

A free-to-use MJML API is available to make it easy to integrate MJML in your application. Head over here to learn more about the API.

MJML Slack

MJML wouldn't be as cool without its amazing community. Head over the Community Slack to meet fellow MJML'ers.

Contributors

Comments
  • Ability to add custom properties

    Ability to add custom properties

    I'd like the ability to add custom properties and values.

    Currently I build a lot of editable templates for clients to use in mailchimp, it would be preferable to define the editable areas in the mjml rather than having to retro-fit it to the compiled html.

    For instance: <mj-text color="#ffffff" font-size="28" align="center" padding-top="40" mc:edit="title">

    Feature request 
    opened by dalefish 89
  • Entire button as link

    Entire button as link

    Hi Guys,

    Firstly - thanks for the great work in building mjml, it makes my life so much easier!

    I'm not sure if this is possible or if it's already planned.

    Currently, using <mj-button> with href results in the text on the button being linked, but not the button itself. For a large button with small text, this results in a large area that's not clickable.

    Is it possible to change how the button links work so that the entire button is a link, rather than just the text?

    Feature request Help needed 
    opened by jaypeedevlin 58
  • Columns breaks on some Google Apps account

    Columns breaks on some Google Apps account

    (with Chrome 48.0.2564.97 (64-bit), on Mac OsX El Capitan)

    As seen on your site template :

      <!-- Side image -->
      <mj-section background-color="white">
        <mj-column>
            <mj-image width="200" src="https://designspell.files.wordpress.com/2012/01/sciolino-paris-bw.jpg"></mj-image>
        </mj-column>
        <mj-column>
            <mj-text font-style="italic"
                     font-size="20"
                     font-family="Helvetica Neue"
                     color="#626262">
                Find amazing places
            </mj-text>
            <mj-text color="#525252">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin rutrum enim eget magna efficitur, eu semper augue semper. Aliquam erat volutpat. Cras id dui lectus. Vestibulum sed finibus lectus.</mj-text>
        </mj-column>
      </mj-section>
    

    Does not render well in gmail : Image

    Work in that case (small texts in columns) :

    <mj-section>
        <mj-column>
            <mj-text align="center">
              foo
            </mj-text>
        </mj-column>
        <mj-column>
            <mj-text align="center">
              bar
            </mj-text>
        </mj-column>
    </mj-section>
    

    but not with more text :

    <mj-section>
        <mj-column>
            <mj-text align="center">
              Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
              tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
              quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
              consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
              cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
              proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
            </mj-text>
        </mj-column>
        <mj-column>
            <mj-text align="center">
              Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
              tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
              quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
              consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
              cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
              proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
            </mj-text>
        </mj-column>
    </mj-section>
    

    opened by philippebarbosa 58
  • NEW <mjml-chart/>

    NEW

    opened by FGRibreau 35
  • Templating needs be a first class feature of mjml

    Templating needs be a first class feature of mjml

    Overview

    I believe that it is a mistake for this project to maintain an unopinionated position about templating. 99% of systems using mjml will have some form of data binding in conjunction with mjml. Correct me if I'm wrong but I don't think that creating completely static email by hand is a super common scenario.

    Problem

    Currently mjml has tools created for it to view the rendered html in various simulated test environments (mobile or desktop, etc.) This is great but if those tools have no idea about the templating transformations applied to it and the data that goes into it then you have one of two options:

    1. View the original mjml files which won't look right or might not work at all because they have invalid templating syntax mixed in
    2. View the generated mjml, which is the product of running it through a custom transformation pipeline and composed with data but now has the downside of not being the original files in code. Therefore if you try to edit that output it will be lost and somehow needs to be translated back into the original source.

    For example this vscode-plugin: https://marketplace.visualstudio.com/items?itemName=attilabuti.vscode-mjml

    It won't work on files with handlebars syntax mixed in and if I'm looking at the files my build step produces I won't be able to edit it in the left because its not the right code. Same for the desktop tool.

    Currently the examples appear to be geared towards people creating completely static templates with hand rolled sample data and you cannot simply use that as is and now you have a disconnect between people making email templates and the files that actually need to go into the file system, resulting in manual translations.

    Is your feature request related to a problem? Please describe. There are no built in semantics for data binding, conditionals or loops therefore tools can't be made to view templated mjml files easily and all the current tools are designed to edit or view the final product not the actual source code in the project.

    Describe the solution you'd like Either just pick handlebars as a first class citizen or implement your own syntax to allow data binding.

    Add a tag which be used to describe sample data for use by tools when rendering but is ignored at runtime.

    Off the top of my head prototype:

    <mj-data type="lorem-ipsum">
      <mj-sentence name="title" />
      <mj-list min="1" max="10" name="items">
        <mj-phrase name="name" />
        <mj-paragraph name="description" />
      </mj-list>
    </mj-data
    

    Then the display tools could use a lorem-ipsum generator to generate objects which can be used to dynamically expand what is visualized into a fully static content.

    Describe alternatives you've considered Using handlebars and then creating a html server which serves up the transformed mjml then try to point the dev tool at a url instead of the file system, use source maps to get the editor to map back to the original source files.

    Additional Context I'm just saying that this was the path html went down a long time ago and it has the drawbacks mentioned above but its too late for html. Since then there have been some improved techniques invented which is essentially to have integrated databinding semantics. Take a look at DataBinding in xaml for example.

    I used to work on design tools for Microsoft in both visual studio and on the "new" IE developer tools and I can tell you that this is an important aspect to have in the base language for all future languages. Your tooling will always be limited or disconnected from the original source code if you go down this path and you'll need the same problematic workarounds that html suffers from where you have to use source maps and you have to have developers who can translate between the templates and the mjml that designers create manually.

    Discussion 
    opened by justinmchase 30
  • [Feature request]: mjml as api service

    [Feature request]: mjml as api service

    Hi! I use mjml and python/django by command mjml and pipe-line for pass template and get result. It is very simple but very slow -- 0.8 - 2 seconds. https://github.com/liminspace/django-mjml/blob/master/mjml/tools.py#L9

    Then I try make tcp-server for keep mjml instance in process and I get better speed -- 0.1-0.2 seconds. https://github.com/liminspace/django-mjml/blob/master/mjml/node/tcpserver.js

    I am not good in node.js, so I propose you make mjml-api-server that other non-node.js services can use it as fast as possible.

    Feature request 
    opened by liminspace 29
  • mj-group stacking into column on Gmail for iOS

    mj-group stacking into column on Gmail for iOS

    mj-group containing 2 columns with images breaks into a stacked column on Gmail for iOS. I have exported my code minified using the CLI command mjml source.mjml -o output.html --config.minify as well as using this tool, which was recommended in a separate issue. Here is the relevant section of my code (non-minified):

      <mj-body background-color="#F2F2F2" width="500px">
        <mj-section background-color="#FFFFFF" vertical-align="center" padding="24px 16px 30px">
          <mj-group vertical-align="center">
            <mj-column>
              <mj-image width="190px" padding="0"  src="https://marketing.cloudagentsuite.com/cdnr/34/acton/attachment/35764/f-0016/1/-/-/-/-/cloud-agent-suite-logo.png" alt="Cloud Agent Suite" />
            </mj-column>
            <mj-column>
              <mj-image width="98px" padding="0" align="right" src="https://marketing.cloudagentsuite.com/cdnr/34/acton/attachment/35764/f-0017/1/-/-/-/-/mlsok.png" alt="MLS OK" />
            </mj-column>
          </mj-group>
        </mj-section>
    <!-- the remainder of the email -->
    </mj-body>
    

    And this is the result:

    ios gmail

    Reproduction Steps:

    1. Start with the mj-group example from the docs
    2. Replace image paths with my own, use correct width of image.
    3. minify output using CLI or tool mentioned above.
    4. paste code into litmus and run browser previews

    Expected behavior:

    I would expect the images to remain on the same line, and not break into a column, like so:

    should be like this

    Observed behavior:

    The image on the right falls beneath the image on the left, stacking them into a column on Gmail for iOS as well as Inbox for iOS.

    Screenshots and GIFs

    Screenshots included above.

    MJML version:

    4.0.5

    Email clients the bug is seen on:

    • Gmail App (iOS 10.3.2)
    • Inbox by Gmail (iOS 10.3.2)
    opened by skywinston 28
  • running several concurrent `yarn run mjml` fails some

    running several concurrent `yarn run mjml` fails some

    Describe the bug running mjml via yarn multiple times concurrently gets about 50% of the processes killed.

    To Reproduce

    1. create an /tmp/in.mjml file
    2. run for i in {1..40}; dowhich yarnrun mjml -r /tmp/in.mjml -o /tmp/out_$i.html & done (run mjml 40 times concurrently)
    3. some of the mjml are killed (sigkill) and some (not necessarily corresponding) html files not created.
    [1]   Done                    `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [2]   Done                    `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [3]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [4]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [5]   Exit 1                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [6]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [7]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [8]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [9]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [10]   Exit 1                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [11]   Exit 137                `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [12]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [13]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [14]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [15]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [16]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [17]   Exit 1                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [18]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [19]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [20]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [21]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [22]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [23]   Done                    `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [24]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [25]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [26]   Done                    `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [27]   Exit 1                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [28]   Done                    `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [29]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [30]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [31]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [32]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [33]   Done                    `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [34]   Done                    `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [35]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [36]   Exit 1                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [37]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [38]   Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [39]-  Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    [40]+  Killed                  `which yarn` run mjml -r /tmp/in.mjml -o /tmp/out_$i.html
    
    1. run
     ls -1 /tmp/out_*
    /tmp/out_1.html
    /tmp/out_10.html
    /tmp/out_12.html
    /tmp/out_14.html
    /tmp/out_17.html
    /tmp/out_18.html
    /tmp/out_19.html
    /tmp/out_2.html
    /tmp/out_23.html
    /tmp/out_24.html
    /tmp/out_26.html
    /tmp/out_27.html
    /tmp/out_28.html
    /tmp/out_30.html
    /tmp/out_33.html
    /tmp/out_34.html
    /tmp/out_36.html
    /tmp/out_37.html
    /tmp/out_38.html
    /tmp/out_40.html
    /tmp/out_6.html
    

    Expected behavior All mjml executions are successful and all the files created

    MJML environment (please complete the following information):

    • OS: Linux app.0 4.19.205-0psh2 #0psh2 SMP PREEMPT Fri, 27 Aug 2021 12:03:59 -0700 x86_64 GNU/Linux
    • MJML 4.12.0
    • MJML tool used yarn run mjml and yarn run v1.22.18

    Additional context executing the command shows a number of warnings:

    warning Skipping preferred cache folder "/app/.cache/yarn" because it is not writable.
    warning Selected the next writable cache folder in the list, will be "/tmp/.yarn-cache-10000".
    $ /app/node_modules/.bin/mjml -h
    warning Cannot find a suitable global folder. Tried these: "/usr/local, /app/.yarn"
    
    opened by DonGiulio 27
  • Wrong version displayed on mjml --version

    Wrong version displayed on mjml --version

    Hi, thank you so much for this beautiful piece of work.

    I am trying to upgrade to 2.3.2. Unistalled and reinstalled again using npm but it still showing 2.3.1

    Bug CLI 
    opened by yumyo 25
  • v4.10.0 is breaking our app

    v4.10.0 is breaking our app

    Describe the bug

    Our build starts to fail while updating mjml to v4.10.0

    To Reproduce

    Upgrade to v4.10.0 from v4.9.3

    Expected behavior

    Our builds still pass, and emails are rendered :+1:

    MJML environment (please complete the following information):

    • OS: Ubuntu 20.04
    • MJML Version 4.10.0
    • MJML tool used [e.g MJML App]: The MJML API

    Additional context

    /builds/stordata/cmdb/node_modules/mjml-core/lib/index.js:66
    var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
                           ^
    TypeError: _interopRequireDefault is not a function
        at Object.<anonymous> (/builds/stordata/cmdb/node_modules/mjml-core/lib/index.js:66:24)
        at Module._compile (internal/modules/cjs/loader.js:1063:30)
        at Module.replacementCompile (/builds/stordata/cmdb/node_modules/append-transform/index.js:60:13)
        at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
        at Object.<anonymous> (/builds/stordata/cmdb/node_modules/append-transform/index.js:64:4)
        at Module.load (internal/modules/cjs/loader.js:928:32)
        at Function.Module._load (internal/modules/cjs/loader.js:769:14)
        at Module.require (internal/modules/cjs/loader.js:952:19)
        at require (internal/modules/cjs/helpers.js:88:18)
        at Object.<anonymous> (/builds/stordata/cmdb/node_modules/mjml/lib/index.js:12:41)
        at Module._compile (internal/modules/cjs/loader.js:1063:30)
        at Module.replacementCompile (/builds/stordata/cmdb/node_modules/append-transform/index.js:60:13)
        at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
        at Object.<anonymous> (/builds/stordata/cmdb/node_modules/append-transform/index.js:64:4)
        at Module.load (internal/modules/cjs/loader.js:928:32)
        at Function.Module._load (internal/modules/cjs/loader.js:769:14)
        at Module.require (internal/modules/cjs/loader.js:952:19)
        at require (internal/modules/cjs/helpers.js:88:18)
        at Object.<anonymous> (/builds/stordata/cmdb/backend/mailer.js:2:390)
        at Module._compile (internal/modules/cjs/loader.js:1063:30)
        at Module.replacementCompile (/builds/stordata/cmdb/node_modules/append-transform/index.js:60:13)
        at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    

    Looking at https://app.renovatebot.com/package-diff?name=mjml&from=4.9.3&to=4.10.0 I can see this image

    I suppose that's not what you want :)

    opened by ddolcimascolo 24
  • Mj Include crash on latest Beta

    Mj Include crash on latest Beta

    Describe the bug When I put a mj-include in mj-head, node throws this:

    TypeError: setBackgroundColor is not a function
        at MjBody.render (/api/node_modules/mjml-body/lib/index.js:67:7)
        at /api/node_modules/mjml-core/lib/createComponent.js:336:28
        at Array.map (<anonymous>)
        at MjHead.handlerChildren (/api/node_modules/mjml-core/lib/createComponent.js:317:24)
        at MjHead.handler (/api/node_modules/mjml-head/lib/index.js:43:19)
        at _processing (/api/node_modules/mjml-core/lib/index.js:235:26)
        at Object.mjml2html [as default] (/api/node_modules/mjml-core/lib/index.js:329:25)
        at compileTemplate (/api/src/emails/templates/index.ts:16:30)
        at Object.<anonymous> (/api/src/emails/templates/index.ts:35:5)
        at Module._compile (internal/modules/cjs/loader.js:701:30)
    

    To Reproduce email.mjml

    <mjml>
    	<mj-head>
    		<mj-include path="./partials/style.mjml" />
    	</mj-head>
    
    	<mj-body>
    		<mj-section>
    			<mj-column>
    				<mj-text>Blabla, whatever</mj-text>
    			</mj-column>
    		</mj-section>
    	</mj-body>
    </mjml>
    

    partials/style.mjml

    <mj-attributes>
    	<mj-text font-family="Arial" font-size="14px" line-height="170%" align="center" />
    </mj-attributes>
    

    Expected behavior It should compile nicely.

    MJML environment (please complete the following information):

    • OS: Ubuntu 18.04
    • MJML Version: 4.4.0-beta.2
    • MJML tool used: mjml for node

    Additional context When I remove the mj-include, it compiles without error.

    Notice that another bug occurs whith mj-include when I put one just after the first mj-body tag: email.mjml

    <mjml>
    	<mj-body>
    		<mj-include path="./partials/header.mjml" />
    		<mj-section>
    			<mj-column>
    				<mj-text>Blabla, whatever</mj-text>
    			</mj-column>
    		</mj-section>
    	</mj-body>
    </mjml>
    

    throws mj-section cannot be used inside mj-raw, only inside: mj-attributes, mj-body, mj-wrapper.

    But if I put it before the last mj-body tag AND after a comment, it works.
    I mean... it doesn't work at the end (partial is not included) but it doesn't throw anything.

    opened by nagman 23
  • Bump json5 from 1.0.1 to 1.0.2

    Bump json5 from 1.0.1 to 1.0.2

    Bumps json5 from 1.0.1 to 1.0.2.

    Release notes

    Sourced from json5's releases.

    v1.0.2

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295). This has been backported to v1. (#298)
    Changelog

    Sourced from json5's changelog.

    Unreleased [code, diff]

    v2.2.3 [code, diff]

    v2.2.2 [code, diff]

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295).

    v2.2.1 [code, diff]

    • Fix: Removed dependence on minimist to patch CVE-2021-44906. (#266)

    v2.2.0 [code, diff]

    • New: Accurate and documented TypeScript declarations are now included. There is no need to install @types/json5. (#236, #244)

    v2.1.3 [code, diff]

    • Fix: An out of memory bug when parsing numbers has been fixed. (#228, #229)

    v2.1.2 [code, diff]

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Google mail doesnt display fonts correctly

    Google mail doesnt display fonts correctly

    Describe the bug A clear and concise description of what the bug is.

    Gmail doenst display Outfit font family with mjml -> https://fonts.googleapis.com/css2?family=Outfit:wght@100;200;300;400;500;600;700;800;900

    Is there a list of supported fonts or is there a a way to make the above font supported ?

    To Reproduce

     <mjml>
        <mj-head>
          <mj-font name="Outfit" href="https://fonts.googleapis.com/css2?family=Outfit:wght@100;200;300;400;500;600;700;800;900" />
        </mj-head>
        <mj-body background-color="#F4F8FB">
          <mj-section>
            <mj-column background-color="#F4F8FB">
              <mj-image width="300px" src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Test-Logo.svg/783px-Test-Logo.svg.png"></mj-image>
            </mj-column>
          </mj-section>
          <mj-section background-color="#FFFFFF">
            <mj-column>
              <mj-text font-family="Outfit, Ubuntu" font-size="24px" font-weight="500"  line-height="34px">
                Forgotten your password ?
              </mj-text>
            </mj-column>
          </mj-section>
          <mj-section background-color="#FFFFFF">
            <mj-column>
              <mj-text font-size="16px" line-height="24px" font-family="Outfit, Ubuntu" font-weight="300">We have recieved your reset password request, please click on the "Change password" button below, make sure to have a look at the following rules</mj-text>
              <mj-text font-size="16px" line-height="24px"  font-family="Outfit, Ubuntu" font-weight="300">
                Your new password must include:</mj-text>
              <mj-text font-size="16px"  line-height="24px"  font-family="Outfit, Ubuntu" font-weight="300">
                <li>10 - 46 characters</li>
                <li>At least 2 mixed-case letter</li>
                <li>At least 3 number</li>
              </mj-text>
              <mj-text css-class font-size="16px"  font-family="Outfit, Ubuntu" font-weight="300">
                If you did not initiate this password reset, please contact us.</mj-text>
            </mj-column>
          </mj-section>
          <mj-section background-color="#FFFFFF">
            <mj-column>
              <mj-text font-family="Outfit, Ubuntu" font-size="16px"  font-weight="300">
                Thanks,
              </mj-text>
              <mj-text font-family="Outfit, Ubuntu" font-size="16px"  font-weight="300">
                The <span style="font-weight: 600">Test Team</span>
              </mj-text>
            </mj-column>
          </mj-section>
          <mj-section background-color="#FFFFFF">
            <mj-column>
              <mj-button background-color="#da2028" font-family="Outfit, Ubuntu" width="100%" border-radius="4px" height="50px" font-size="18px" href="/">Change Password</mj-button>
            </mj-column>
          </mj-section>
          <mj-section background-color="black">
            <mj-column width="25%">
              <mj-button height="15px" font-family="Outfit, Ubuntu" background-color="black" href="/" padding="0">Privacy Policy</mj-button>
            </mj-column>
            <mj-column width="50%">
              <mj-button height="15px" font-family="Outfit, Ubuntu" background-color="black" href="/" padding="0">© Copyright 2022 Test</mj-button>
            </mj-column>
          </mj-section>
        </mj-body>
      </mjml>
    

    Expected behavior Should display fonts in gmail

    MJML environment (please complete the following information):

    • OS: Windows & Mac
    • MJML Version: 4.13.0
    • MJML tool used: https://mjml.io/try-it-live/

    Email sending environment(for rendering issues):

    • Gmail

    Affected email clients (for rendering issues):

    • Email Client: Gmail
    • OS: Windows & Mac
    • Browser: Firefox, Safari, Chrome

    Additional context Works perfectly everywhere else but not in Gmail (Google mail in browser)

    opened by Faziki 3
  • Title Tag on mj-button is being stripped away

    Title Tag on mj-button is being stripped away

    <mj-button css-class="centerText mAuto padT10" align="right" href="https://www.google.com" title="MOTE_SAMPLE" target="_blank" background-color="#34A293" border-radius="10px" color="#ffffff" font-size="16px" font-weight="bold" inner-padding="10px 18px 10px 18px"> Request Samples </mj-button>

    Here is the output HTML

    <td align="center" bgcolor="#34A293" role="presentation" style="border:none;border-radius:10px;cursor:auto;mso-padding-alt:10px 18px 10px 18px;background:#34A293;" valign="middle"><a href="https://www.google.com" style="display:inline-block;background:#34A293;color:#ffffff;font-family:Arial, Helvetica, sans-serif;font-size:16px;font-weight:bold;line-height:120%;margin:0;text-decoration:none;text-transform:none;padding:10px 18px 10px 18px;mso-padding-alt:0px;border-radius:10px;" target="_blank">Request Samples</a></td>

    opened by JakeLeffler-eversana 1
  • Comments in MJML add spaces when rendered in HTML

    Comments in MJML add spaces when rendered in HTML

    When adding comments in MJML, the outputted comments contain spaces between the brackets and the comments.

    For example:

    MJML: <!--[if !mso]-->

    HTML output:

    <!-- [if !mso] -->

    Which isn't read by outlook. Is there a way around this?

    opened by connorHashDash 4
  • Fixed the unclickable area in MSO-PC for the buttons

    Fixed the unclickable area in MSO-PC for the buttons

    Notes for the previous Issue #359 fixed here, following the discussion at Issue #2565

    In getStyles.td:

    Removed the mso-padding-alt as inner padding cause is no longer needed when the size of the button is controlled by the padding in the anchor. If I keep the MSO-attribute, the button will be shown as twice the size in MSO-PC.

    in getStyles.content:

    Removed the mso-padding-alt: 0px cause is nullifying the effect of activating the anchor as a button in MSO-PC. The padding in the anchor is now effectively creating the internal size of the button.

    Added border:

    1px solid which activates a "bug" in MSO-PC, forcing MSO to read the display attribute of the button (default: inline-block) and thus, changing the behavior of the anchor in MSO to act like a common anchor in all the other readers/browsers.

    To avoid non-corresponding colours between the background of the container TD and the border created in the anchor, I added the this.getAttribute('background-color') property to the style, aligning both colours, minimizing the unwilling mismatching.

    Results in MSO-PC

    OUTLOOK_XV0ASQ3Yp9

    Tested in EoA:

    msedge_LmhK6iasyn

    msedge_vFvHRbUEhY

    msedge_GJFkN9eRU4

    msedge_dmll9qjS51

    msedge_NvHu4RHSal

    Tested in Litmus

    msedge_y3YeP1cyMR

    msedge_yKEEjAEX4a

    msedge_yKEEjAEX4a

    opened by fernamp 2
  • High Severity Vulnerability in html-minifier

    High Severity Vulnerability in html-minifier

    Hello, our security check has found a high severity vulnerability in html-minifier, which is a dependency of mjml.

    Dependency hierarchy:

    • mjml-4.13.0.tgz (Root Library)
    • mjml-cli-4.13.0.tgz
    • ❌ html-minifier-4.0.0.tgz (Vulnerable Library)

    Vulnerability description: A Regular Expression Denial of Service (ReDoS) flaw was found in kangax html-minifier 4.0.0 via the candidate variable in htmlminifier.js.

    Here is a link to a similar issue in html-minifier. It does not seem to be worked on.

    https://github.com/kangax/html-minifier/issues/1135

    Can you update your repository to get rid of this vulnerability?

    opened by PavelBurya 4
Releases(v4.13.0)
  • v4.13.0(Aug 19, 2022)

    What's Changed

    • Fix typo in documentation by @pointmax in https://github.com/mjmlio/mjml/pull/2423
    • Typo fixed (paragraph 07) by @kant in https://github.com/mjmlio/mjml/pull/2436
    • carousel-URLs by @GarryFlemings in https://github.com/mjmlio/mjml/pull/2438
    • DOCS: spelling-cli by @GarryFlemings in https://github.com/mjmlio/mjml/pull/2439
    • Add text-align="center" to doc example by @cmacdonnacha in https://github.com/mjmlio/mjml/pull/2422
    • Add Parcel (https://parcel.io) to tooling docs by @BrianBock in https://github.com/mjmlio/mjml/pull/2446
    • MJML3--time to remove reference to it? by @GarryFlemings in https://github.com/mjmlio/mjml/pull/2454
    • Add protocol to parcel link by @georgeblahblah in https://github.com/mjmlio/mjml/pull/2462
    • [#2475] Add lang and dir attribute to body's div by @iRyusa in https://github.com/mjmlio/mjml/pull/2476

    New Contributors

    • @pointmax made their first contribution in https://github.com/mjmlio/mjml/pull/2423
    • @kant made their first contribution in https://github.com/mjmlio/mjml/pull/2436
    • @cmacdonnacha made their first contribution in https://github.com/mjmlio/mjml/pull/2422
    • @BrianBock made their first contribution in https://github.com/mjmlio/mjml/pull/2446
    • @georgeblahblah made their first contribution in https://github.com/mjmlio/mjml/pull/2462

    Full Changelog: https://github.com/mjmlio/mjml/compare/v4.12.0...v4.13.0

    Source code(tar.gz)
    Source code(zip)
  • v4.12.0(Jan 26, 2022)

    Features

    • allow to add text before doctype (#2146)
    • allow to use a .mjmlconfig.js, allow to provide preprocessors in mjmlconfig.js (#2249)
    • expose mjml file path in components props (#2344)

    Fixes

    • watch on non mjml includes (#2261)
    • better error message when malformed mjml (#2372)
    Source code(tar.gz)
    Source code(zip)
  • v4.11.0(Nov 25, 2021)

    What's Changed

    • Allow functions to be added as styles in head by @vidhu in https://github.com/mjmlio/mjml/pull/2377

    New Contributors

    • @vidhu made their first contribution in https://github.com/mjmlio/mjml/pull/2377

    Full Changelog: https://github.com/mjmlio/mjml/compare/v4.10.4...v4.11.0

    Source code(tar.gz)
    Source code(zip)
  • v4.10.3(Sep 10, 2021)

    Features

    • Update @babel/runtime dependency on all packages (thanks @doits)

    Fixes

    • Documentation fix (thanks @GarryFlemings)
    • Docs and linter corrections for invalid / missing attributes (fixes #2352, thanks @BenjaminNolan)
    • Add title missing attribute on mj-button
    Source code(tar.gz)
    Source code(zip)
  • v4.10.2(Jul 21, 2021)

    Features

    • Add cli flag to omit file header comment on stdout (fixes #2039, thanks @timo-reymann)
    • Allow components that use the color validator on an attribute without a default value (fixes #1955, #2315, thanks @chadfurman)
    • Support "inherit" color (thanks @chadfurman)
    • Update dependencies

    Fixes

    • Documentation updates (thanks @GarryFlemings, @timo-reymann)
    Source code(tar.gz)
    Source code(zip)
  • v4.10.1(Jun 24, 2021)

    Features

    • Add role attribute to mj-table (fixes #2303, thanks @mohamedsalem401)
    • Add role: 'presentation' on mj-section's table (thanks @mohamedsalem401)

    Fixes

    • Require newer babel runtime (fixes #2299, thanks @doits)
    • Documentation update (thanks @GarryFlemings)
    Source code(tar.gz)
    Source code(zip)
  • v4.10.0(Jun 17, 2021)

    Features

    • Add documentation for community component msobutton, (thanks @Adrien Zinger)

    Fixes

    • Fix background image in mj-section for Yahoo and AOL. (fixes #2098, thanks @Pharmasolin)
    • Added missing tags in mjml-hero, mjml-button, mjml-social (thanks @Pharmasolin)
    • removed useless "tagOmission" property on some components (thanks @GarryFlemings)
    • Update cheerio (thanks @pfmnzone)
    • Documentation improvements (thanks @GarryFlemings)

    Potential breaking changes

    • The missing tbody tags that were added on mjml-hero, mjml-button and mjml-social might require a change in the css selectors, i.e. if you used a mj-style with .css-class > table > tr you'll need to add the tbody in the selector.
    Source code(tar.gz)
    Source code(zip)
  • v4.9.3(Apr 30, 2021)

  • V4.9.2(Apr 30, 2021)

    Fixes

    • Added quotes for 'href' and 'rel' attributes values on mj-carousel image (fixes #2242)
    • handle keepComments option in cli (fix #2206)
    • re-implement owa (fix #2241)
    Source code(tar.gz)
    Source code(zip)
  • v4.9.1(Apr 23, 2021)

  • v4.9.0(Mar 3, 2021)

    Features

    • Add mjml-preset-core package, which contains all standard components, and can be passed to mjml-core's mjml2html. (thanks @TrySound)
    • mj-include can now be used to include css and html files (ref #2026)
    • Add specific media queries for thunderbird

    Fixes

    • mj-raw can now be used in mj-social
    • Removed the media queries for owa as they're not needed anymore
    • Improved mj-accordion documentation @GarryFlemings
    Source code(tar.gz)
    Source code(zip)
  • v4.8.2(Mar 1, 2021)

    Features

    • mj-button: Add support for title attribute (thanks @lahdekorpi)

    Fixes

    • mjml-cli: Fix minify and beautify config when compiling multiple files (fixes #2163)
    • Transpile classes (fixes #2149, thanks @TrySound)
    • mjml-hero: Fix background image bug in Yahoo and AOL (fixes #2098, thanks @Pharmasolin)
    • mj-divider: Fix width on Outlook when set in percent (thanks @quetzalcoatlAxolotl)
    • Default dependencies in .mjmlconfig (fixes #2141, thanks @ryanburr)
    • Documentation improvements (thanks @valse, @hikiroom)
    Source code(tar.gz)
    Source code(zip)
  • v4.8.1(Dec 30, 2020)

    Fixes

    • Prevent the validator from throwing an error when mjml is provided as Json and some components have no attributes property (thanks @BenjaminNolan)
    Source code(tar.gz)
    Source code(zip)
  • v4.8.0(Dec 29, 2020)

    Features

    • A new package mjml-browser is available. Use this package if you need to use MJML client-side.
    • Add align attribute to mj-divider (thanks @thierrylemoulec)
    • Supports returning siblings elements from a custom component (thanks @IanEdington)
    • Move js-beautify and html-minifier to cli, and flag minify and beautify options as deprecated in mjml-core. They will be removed from the core and only available in cli in MJML 5. (thanks @TrySound)
    • Flag mjml-migrate as deprecated. It will be removed in MJML 5. (thanks @TrySound)
    • Transpile lib for node 10 (thanks @TrySound)
    • Refacto mjml-validator (thanks @TrySound)
    • Bump all dependencies (thanks @DRoet)

    Fixes

    • Fix mjml-spacer in outlook, height was ignored when it was the last element of its parent mj-column (fixes #1971, thanks @Pharmasolin)
    • Fix independent border properties on mj-image (fixes #1939, thanks @Pharmasolin)
    • Fix conditional comment for meta tag in skeleton (thanks @cheapsteak)
    • Added missing <tbody> after <table> tag in mj-column component. (thanks @Pharmasolin)
    • Add @babel/runtime dependency directly to mjml (thanks @doits)
    • Fix issue with stacking columns within mj-group in Gmail for IOS (thanks @jsteele883)
    • Handle border-radius on mj-hero (thanks @vasin)
    • Documentation fixes and additions (thanks @theoomoregbee, @GarryFlemings, @KonstantinLukaschenko)
    Source code(tar.gz)
    Source code(zip)
  • v4.7.1(Sep 30, 2020)

  • v4.7.0(Sep 18, 2020)

    Features

    • Add a new head component, mj-html-attributes, which allows to add any attribute on the generated html tags using css selectors
    • Add support of 'cover' and 'contain' on background-size for mj-section and mj-wrapper (thanks @Alexnortung), and other small improvements of background-images on outlook.
    • Return the mjml json structure (thanks @DRoet)
    • Include directory for monorepo packages (thanks @iamandrewluca)
    • Add support of 'srcset' on mj-social-element (thanks @rickytranmer)
    • Add support of 'sizes' on mj-image and mj-social-element (thanks @rickytranmer)
    • Add support of 'letter-spacing' on multiple components
    • Automatically normalize lodash imports (thanks @TrySound)
    • Expose 'ignoreIncludes' option

    Fixes

    • Fix mjml-migrate dependencies versions (thanks @TrySound)
    • Change to new twitter share link (thanks @kitfit-dave)
    • Fix support of 'font-style' on mj-navbar-link (thanks @kevingermain)
    • Fix to allow empty attributes
    • Upgrade yargs and drop commander (thanks @TrySound)
    • Update juice version (thanks @TrySound)
    • Fix validate command to use the default base directory (thanks Yuri Guilherme)
    • Remove extra argument in call to borderParser (thanks @FelixSchwarz)
    • Code improvements (thanks @TrySound, @DRoet)
    • Documentation improvements (thanks @GarryFlemings)
    • Documentation fixes (thanks @kevingermain, @dmgawel)
    Source code(tar.gz)
    Source code(zip)
  • v4.7.0-beta.2(Aug 28, 2020)

    Features

    • Return the mjml json structure (thanks @DRoet)
    • Include directory for monorepo packages (thanks @iamandrewluca)

    Fixes

    • Fix #1942 mj-html-attribute cause trailing </link></meta>
    • Fix to allow empty attributes
    • Upgrade yargs and drop commander (thanks @TrySound)
    • Fix validate command to use the default base directory (thanks Yuri Guilherme)
    • Remove extra argument in call to borderParser (thanks @FelixSchwarz)
    • Code improvements (thanks @TrySound, @DRoet)
    • Documentation improvements (thanks @GarryFlemings)
    Source code(tar.gz)
    Source code(zip)
  • v4.7.0-beta.1(Jun 2, 2020)

    Features

    • Add a new head component, mj-html-attributes, which allows to add any attribute on the generated html tags using css selectors
    • Add support of 'cover' and 'contain' on background-size for mj-section and mj-wrapper (thanks @Alexnortung), and other small improvements of background-images on outlook.
    • Add support of 'srcset' on mj-social-element (thanks @rickytranmer)
    • Add support of 'sizes' on mj-image and mj-social-element (thanks @rickytranmer)
    • Add support of 'letter-spacing' on multiple components
    • Automatically normalize lodash imports (thanks @TrySound)
    • Expose 'ignoreIncludes' option

    Fixes

    • Fix mjml-migrate dependencies versions (thanks @TrySound)
    • Change to new twitter share link (thanks @kitfit-dave)
    • Fix support of 'font-style' on mj-navbar-link (thanks @kevingermain)
    • Documentation fixes (thanks @kevingermain, @dmgawel)
    Source code(tar.gz)
    Source code(zip)
  • v4.6.3(May 5, 2020)

  • v4.6.1(Mar 3, 2020)

  • v4.6.0(Mar 3, 2020)

    Features

    • Add preprocessors to mjml parser - Fixes #42, #874, #457, #459 (thanks @XBeg9)
    • Add "inner-background-color" to mj-column to improve gutter. You can set different background-colors for padding and content. Also adds "inner-border" and "inner-border-radius".
    • Add "letter-spacing" attribute to mj-button (thanks @milap1296)
    • Add "usemap" attribute to mj-image (thanks @vinikira)

    Fixes

    • Fix #1628 --filePath option accepts directories. Also, fix watch of nested includes when filePath is specified.
    • Fix #1670 mj-accordion fallback for Thunderbird (thanks @bertho-zero)
    • Fix #1801 dont escape url when "baseUrl" is set on mj-navbar
    • Fix mj-group background-color on outlook 2016 - set bgcolor on table (thanks @btd)
    • Fix invalid font-size value on p tag on mj-divider (thanks @allentsai93)
    • Fix #1848 cli --version alias
    • Allow "border-radius" to be percentage or px based on several components (thanks @zslabs)
    • Fix http links in code examples (thanks @edjw)
    • Multiple documentation improvements (thanks @GarryFlemings, @toantqt, @petetnt, @allanlewis, @davidsneighbour)
    Source code(tar.gz)
    Source code(zip)
  • v4.5.1(Sep 27, 2019)

  • v4.5.0(Sep 17, 2019)

    Features

    • Allow social elements without links to make simple image-text lists (thanks @krystof-k)
    • Trigger validation warning when mj-include file is not found (#1689)
    • Mj-text line-height accepts negative values (#1639)
    • Prefix some css classes with mj- (#1620)

    Fixes

    • Update to latest Yargs to resolve vulnerable transient dependencies (thanks @hermanbanken)
    • Fix auto generated column classes conflicts

    Minor breaking changes

    • Due to the fix of the auto generated column classes, 3 columns with no width specified will now have a css class mj-column-per-33-333333333333336 instead of mj-column-per-33. Also, the outlook-group-fix and full-width-mobile classes have been prefixed with mj-. Be careful if you used those in a css selector.
    • Due to the "social elements without links" feature, a mj-social-element with neither name nor href will no longer have a <a> tag around it.
    Source code(tar.gz)
    Source code(zip)
  • v4.4.0(Jul 17, 2019)

    Features

    • Mj-buttons are now Fully clickable ! (except on outlook)(Thanks to @hellocosmin !) Fully clickable when width is in px, when width is in % only the inner-padding is clickable
    • Mj-image: Fix Alt Text, allow font-size and max-height attribute (thanks @Zelltron)
    • Allow to preserve tags from being altered by juice when inlining css (#1450)
    • Add an option to disable migration warnings
    • allow to specify base path for mj-includes in cli (#1546)
    • doc to ignore content during minification (#1527)
    • Other documentation updates

    Fixes

    • fix parser issue when failed include (#1607)
    • ignore raw elements in column width calculation in mj-group (#1621)
    • remove old windows phone 8 fix , remove old outlook fixes, lowercase Margin (#1619, #1618, #1614 thanks @hteumeuleu)
    • Bump chokidar & juice to resolve a security vulnerability (thanks @schmod)
    • https for carousel arrows img urls (thanks @sylvaindumont )
    • Upgrade chokidar to fix braces CVE (#1516 thanks @Sparticuz)
    • Fix cli output path calculation with \ separators (windows)
    • Move cross-env into devDependencies (thanks @nexdrew)
    • handle auto value in unit validation, allow it in mj-image height (#1538)
    • set mj-column font-size to 0 (#1560)
    • remove cellpadding and cellspacing from mj-table style
    • Allow 2 values for inner-padding on mj-button and mj-social (thanks @aew)
    • Fix Navbar ico-align attribute (#1495)
    • Don't migrate null values when migrating a json template
    • Fix validation regex, allow unitless line-height and paddings on navbar
    • Fix for ipad display block on social image (#1441)
    • Hero width defaults to container width (#1632)
    Source code(tar.gz)
    Source code(zip)
  • v4.4.0-beta.3(Jul 2, 2019)

    Fixes

    • fix parser issue when failed include (#1607)
    • ignore raw elements in column width calculation in mj-group (#1621)
    • remove old windows phone 8 fix , remove old outlook fixes, lowercase Margin (#1619, #1618, #1614 thanks @hteumeuleu)
    • Bump chokidar & juice to resolve a security vulnerability (thanks @schmod)
    • https for carousel arrows img urls (thanks @sylvaindumont )
    Source code(tar.gz)
    Source code(zip)
  • v4.4.0-beta.2(May 24, 2019)

    Features

    • Improve mj-button clickable zone when fixed width
    • allow to specify base path for mj-includes in cli (#1546)
    • doc to ignore content during minification (#1527)
    • Other documentation updates

    Fixes

    • Upgrade chokidar to fix braces CVE (#1516 thanks @Sparticuz)
    • Fix cli output path calculation with \ separators (windows)
    • Move cross-env into devDependencies (thanks @nexdrew)
    • handle auto value in unit validation, allow it in mj-image height (#1538)
    • set mj-column font-size to 0 (#1560)
    • remove cellpadding and cellspacing from mj-table style
    • Allow 2 values for inner-padding on mj-button and mj-social (thanks @aew)
    Source code(tar.gz)
    Source code(zip)
  • v4.4.0-beta.1(Feb 18, 2019)

    Features

    • Mj-buttons are now Fully clickable ! (except on outlook)(Thanks to @hellocosmin !)
    • Mj-image: Fix Alt Text, allow font-size and max-height attribute (thanks @Zelltron)
    • Allow to preserve tags from being altered by juice when inlining css (#1450)
    • Add an option to disable migration warnings

    Fixes

    • Fix Navbar ico-align attribute (#1495)
    • Don't migrate null values when migrating a json template
    • Fix validation regex, allow unitless line-height and paddings on navbar
    • Fix for ipad display block on social image (#1441)
    Source code(tar.gz)
    Source code(zip)
  • v4.3.1(Jan 8, 2019)

    Fixes

    • Flush all the rendered html to stdout before exiting in mjml-cli (#1461) (thanks @sangaline!)
    • Validation: accept mj-raw everywhere except in endingTags
    • Migrate can now handle mj-social networks suffixes like :url from mjml v3
    Source code(tar.gz)
    Source code(zip)
  • v4.3.0(Jan 3, 2019)

    Features

    • Added title attribute on social img (#1447)
    • Mjml-migrate now has a beautify option
    • Mjml-validator: small fixes, greatly improved flexibility when used standalone
    • Multiple documentation improvements

    Fixes

    • Fix parsing when a single line endingTag contains an opening tag (#1358)
    • Pinned all internal mjml dependencies versions (#1442)
    Source code(tar.gz)
    Source code(zip)
  • v4.2.1(Nov 26, 2018)

    Features

    • paddings on social icon and text (#1384)
    • support font-weight on style on social (#1412)
    • Allow minifyOptions (#1405) and fonts to be set from cli

    Fixes

    • rm other exports from mjml to fix require('mjml') (#1387)
    • hero children width shouldnt depend on siblings (#1357)
    • most errors will be directed to stderr instead of stdout (#1342)
    • minor doc fixes (#1432)
    • Declare missing dependencies on babel-runtime
    • order attributes alphabetically in docs (#1385)
    Source code(tar.gz)
    Source code(zip)
Owner
MJML
The only framework that makes responsive-email easy
MJML
Pay a lightning email to send an email to the website owner

TODO USE human readable age in encryption (support "e" as backward compatible) go back to referrer or provided option save time taken to send email op

Riccardo Casatta 12 Aug 24, 2022
Implementation of mjml in rust

MRML Introduction This project is a reimplementation of the nice MJML markup language in Rust. How to use it use mrml; fn main() { match mrml::to

Jérémie Drouet 228 Dec 28, 2022
Rust implementation of catapulte email sender

Catapulte What is catapulte? Catapulte is an open source mailer you can host yourself. You can use it to quickly catapult your transactionnal emails t

Jérémie Drouet 108 Dec 14, 2022
📫Himalaya: CLI email client written in Rust.

??Himalaya: CLI email client written in Rust.

Clément DOUIN 2.1k Jan 7, 2023
This app reads a csv file and sends an email with a formatted Handlebars file.

Bulkmail This app reads a csv file and sends an email with a formatted Handlebars file. This can be run on Linux for AMD64 and ARMv7. Upstream Links D

Giovanni Bassi 17 Nov 3, 2022
Automatically check for SPF misconfigurations that could result in email spoofing

SPFJack Email spoofing is dead, but misconfiguration never dies. Purpose This project is designed to take in domain names and review their SPF records

Alex (LunarCA) 2 Mar 27, 2022
A mail suite written in rust meant to be easy to use.

Erooster A mail suite written in rust meant to be easy to use. Getting started Currently the setup is quite rough. You need some certificates for your

Marcel 33 Dec 19, 2022
Check if an email address exists without sending any email, written in Rust.

Check if an email address exists without sending any email, written in Rust.

Reacher 3.5k Dec 31, 2022
Pay a lightning email to send an email to the website owner

TODO USE human readable age in encryption (support "e" as backward compatible) go back to referrer or provided option save time taken to send email op

Riccardo Casatta 12 Aug 24, 2022
Implementation of mjml in rust

MRML Introduction This project is a reimplementation of the nice MJML markup language in Rust. How to use it use mrml; fn main() { match mrml::to

Jérémie Drouet 228 Dec 28, 2022
A library that makes it VERY easy to run Holochain as a library, from your own binary, with great defaults

embedded-holochain-runner A library that makes it VERY easy to run Holochain as a library, from your own binary, with great defaults How it will work

Sprillow 14 Jul 23, 2022
ruby-build is a command-line utility that makes it easy to install virtually any version of Ruby, from source.

ruby-build ruby-build is a command-line utility that makes it easy to install virtually any version of Ruby, from source. It is available as a plugin

null 3.7k Jan 5, 2023
Tangram - makes it easy for programmers to train, deploy, and monitor machine learning models.

Tangram is the all-in-one machine learning toolkit for programmers. Train a model from a CSV file on the command line. Make predictions from Elixir, G

Tangram 1.3k May 3, 2022
procs makes it easy to find and manage system processes

procs procs makes it easy to find and manage system processes. Right now, the main usage is finding processes by the ports it is listening on, but mor

Kurt Wolf 3 Aug 29, 2022
Simple to use CLI tool that makes encryption easy! Written in Rust.

?? eme: Encryption Made Easy an extremely simple AES-256 encryption tool written in Rust Usage: # To encrypt: eme --encrypt secret.png # To decrypt: e

null 5 Jan 3, 2023
A simple self-contained CLI tool that makes it easy to efficiently encrypt/decrypt your files.

cryptic A simple self-contained CLI tool that makes it easy to efficiently encrypt/decrypt your files. Contents Features Building Usage License Featur

Arthur Ivanets 5 May 2, 2023
A simple-to-use input manager for the Bevy game engine that empowers players and makes accessibility easy.

Bevy Ineffable A simple-to-use input manager for the Bevy game engine that empowers players and makes accessibility easy. Core tenets Make accessibili

Jazarro 10 Mar 2, 2024
Rust implementation of catapulte email sender

Catapulte What is catapulte? Catapulte is an open source mailer you can host yourself. You can use it to quickly catapult your transactionnal emails t

Jérémie Drouet 108 Dec 14, 2022
📫Himalaya: CLI email client written in Rust.

??Himalaya: CLI email client written in Rust.

Clément DOUIN 2.1k Jan 7, 2023
This app reads a csv file and sends an email with a formatted Handlebars file.

Bulkmail This app reads a csv file and sends an email with a formatted Handlebars file. This can be run on Linux for AMD64 and ARMv7. Upstream Links D

Giovanni Bassi 17 Nov 3, 2022