SHARE
Facebook X Pinterest WhatsApp

How to Create Custom HTML Newsletter Templates from Scratch

Written By
thumbnail
Rob Gravelle
Rob Gravelle
Jul 14, 2017

By Rob Gravelle with Gyula Németh

In the last few months, Gyula Németh and his team have been working on a in-depth tutorial series about coding HTML emails. Every chapter discusses a different topic and they help the readers learn how they have to use ancient techniques to ensure that their newsletter looks nice on most of the email clients.

The tutorial series already covered the most important issues, so it’s time to show you how to create a nice looking newsletter from scratch that will be enjoyable in most of the email clients.

The email template we will build in this tutorial looks like this:

step06 (240K)

Robust Frame

First of all, we need to create a robust framework for our template. As you can see in the preview, there are wide stripes going across the template. In each one of them, the content is aligned in the middle. The standard width for the content of the email is 600px. It has historical reasons, and it’s already proven that you can play around with different widths.

In our example, we use a 800px wide header and 600px wide content:

...
<center>
  <table cellpadding="0" cellspacing="0" border="0" style="width:100%;max-width:800px;margin: 0 auto;">
    <tr>
      <td width="100%" style="text-align:left;background-color:#ff00ff;">
        <p style="font-family:Georgia,Arial,sans-serif;font-size:14px;line-height:18px;padding-top:10px;padding-bottom:10px">Header</p>
      </td>
    </tr>
  </table>
</center>
<center>
  <table cellpadding="0" cellspacing="0" border="0" style="width:100%;max-width:600px;margin: 0 auto;">
    <tr>
      <td width="100%" style="text-align:left;background-color:#ffff00;">
        <p style="font-family:Georgia,Arial,sans-serif;font-size:14px;line-height:18px;padding-top:10px;padding-bottom:10px">Content</p>
      </td>
    </tr>
  </table>
</center>
<center>
  <table cellpadding="0" cellspacing="0" border="0" style="width:100%;max-width:600px;margin: 0 auto;">
    <tr>
      <td width="100%" style="text-align:left;background-color:#00ffff;">
        <p style="font-family:Georgia,Arial,sans-serif;font-size:14px;line-height:18px;padding-top:10px;padding-bottom:10px">Footer</p>
      </td>
    </tr>
  </table>
</center>
...

step01.png

<style>  
  .col50 {
    width: 50%;
  }

  @media all and (max-width: 599px) {
    .reorder {
      width: 100% !important;
    }
  }
</style>

<!--[if gte mso 9]>  
    <style>
        .ol {
          width: 100%;
        }
    </style>
<![endif]-->

...

<table width="100%" cellpadding="0" cellspacing="0" border="0">  
  <tr>
    <td width="100%" valign="top" style="min-width: 100%;">
      <!--[if gte mso 9]><table width="100%" cellpadding="0" cellspacing="0"><tr><td width="50%" valign="top"><![endif]-->
      <table class="ol col50 reorder" width="100%" align="left" style="width: calc(50%);" cellpadding="0" cellspacing="0" border="0">
        <tr>
          <td width="100%" valign="top">
            ###LEFT_CONTENT###
          </td>
        </tr>
      </table>
      <!--[if gte mso 9]></td><td width="50%" valign="top"><![endif]-->
      <table class="ol col50 reorder" width="100%" align="left" style="width: calc(50%);" cellpadding="0" cellspacing="0" border="0">
        <tr>
          <td width="100%" valign="top">
            ###LEFT_CONTENT###
          </td>
        </tr>
      </table>
      <!--[if gte mso 9]></td><</tr></table><![endif]-->
    </td>
  </tr>
</table>  

step01 (3K)

The result after this step:

step03.png

Adding Images, Setting Background and Font Colors

You might think that adding images is a very easy thing to do, but if you want your images to look nice everywhere, you will need to use the following code:

<div width="###WIDTH###" height="auto">  
    <img alt="###ALT###" width="###IMAGE-WIDTH###" style="display: block; width: 100%; max-width: 100%;" src="###SRC###"/> 
</div>  

It’s the extended version of Julie Ng’s image code, and the details are described here.

I have a good rule of thumb when it comes to colors. You should always set the colors on the full-width element level. The advantage is that you always set it at the same place. It’s also worth mentioning that these color properties are inherited correctly in every email client, so it’s not a problem to define them on top-level elements.

step04 (280K)

<table width="100%" border="0" cellspacing="0" cellpadding="0">  
  <tr>
    <td>
       <table border="0" cellspacing="0" cellpadding="0">
          <tr>
             <td bgcolor="### COLOR ####" style="#### STYLES ####; -webkit-border-radius:3px; border-radius:3px;" align="center">
                 <a href="### HREF ###" target="_blank" style="### FONT PROPERTIES ###;text-decoration:none; line-height:54px; width: 150px; display: inline-block;">
                   <p style="### FONT PROPERTIES ###; line-height:54px;">
                      I am a button &rarr;
                   </p>
                </a>
             </td>
          </tr>
       </table>
     </td>
  </tr>
</table>  

step05 (285K)

It won’t render in the same way across email clients, but it will radically increase the user experience on the modern ones.

Personally, I don’t like to over complicate things when it comes to font families. I use two different font families in this example: one for the headlines and one for the paragraphs.

You have to do the following modifications in the head of your email HTML:

<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet" type="text/css">  

It’s best to inline font related properties, so wherever you use them, font-family should be inlined.

<h1 style="font-family:'Roboto',sans-serif;font-size:24px;line-height:32px;padding-top:10px;padding-bottom:10px">Hero Unit Title</h1>  

step06.png

Now, you might have a sense how complicated email coding can be. You have learned a way to create complex layouts with robust content images, different content widths, with bulletproof buttons and custom fonts.

If you get stuck on one of the steps, you should check out the linked resources for more information or just leave a comment below.

Rob Gravelle

Rob Gravelle resides in Ottawa, Canada, and has built web applications for numerous businesses and government agencies. Email him.

Rob’s alter-ego, “Blackjacques”, is an accomplished guitar player, that has released several CDs. His band, Ivory Knight, was rated as one of Canada’s top hard rock and metal groups by Brave Words magazine (issue #92) and reached the #1 spot in the National Heavy Metal charts on ReverbNation.com.

Gyula Németh

Gyula Németh

Co-founder & CTO @ EDMdesigner.com

Recommended for you...

How to Make Your Site Voice Search Ready
Working with the CSS Image Gallery
HTML Geolocation: How to Find Someone’s Location
Octavia Anghel
Dec 10, 2018
Ten Basic Things Every Web Developer Should Know
Bradley Jones
Dec 3, 2018
HTML Goodies Logo

The original home of HTML tutorials. HTMLGoodies is a website dedicated to publishing tutorials that cover every aspect of being a web developer. We cover programming and web development tutorials on languages and technologies such as HTML, JavaScript, and CSS. In addition, our articles cover web frameworks like Angular and React.JS, as well as popular Content Management Systems (CMS) that include WordPress, Drupal, and Joomla. Website development platforms like Shopify, Squarespace, and Wix are also featured. Topics related to solid web design and Internet Marketing also find a home on HTMLGoodies, as we discuss UX/UI Design, Search Engine Optimization (SEO), and web dev best practices.

Property of TechnologyAdvice. © 2025 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.