Email template engine

Newest version of Mail.dll email library for .NET includes easy to use template engine.

It allows you to easily create html template for your emails:

Loading and rendering such template requires one line of code:

1
2
3
4
5
6
7
8
// C# version
 
Contact templateData = ...;
 
 string html = Template
     .FromFile("template.txt")
     .DataFrom(templateData )
     .Render();
1
2
3
4
5
6
7
8
' VB.NET version
 
Dim templateData As Contact = ....
 
Dim html As String = Template _
     .FromFile("template.txt") _
     .DataFrom(templateData) _
     .Render()

This is how the template looks like:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<html>
<head>
    <title>Your order</title>
</head>
<body>
    Hi [FirstName] [LastName],
    <br />
    <p>
    Your account [if Verified]has[else]<strong>has not</strong>[end] been verified. <br/>
    Your password is: [Password].
    </p>
    <p>
    Here are your orders:
    </p>
    [foreach Orders]
        <p>
        Order sent to <strong>[Street]</strong>:
        </p>
        <table style="width: 30%;">
            [foreach Items]
                <tr style="background-color: #E0ECFF;">
                    <td>[Name]</td><td>[Price]</td>
                </tr>
            [end]
        </table>
    [end]
    <p>
        Thank you for your orders.
    <p>
</body>
</html>

Here’s the sample code that loads, fills the template and sends it using Mail.dll:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
// C# version
 
string rendered = Template
    .FromFile("template.txt")
    .DataFrom(templateData)
    .Render();
 
MailBuilder builder = new MailBuilder();
builder.Html = rendered;
builder.Subject = "Your order";
builder.From.Add(new MailBox("alice@mail.com", "Alice"));
builder.To.Add(new MailBox("bob@mail.com", "Bob"));
IMail email = builder.Create();
 
using (Smtp client = new Smtp())
{
    client.ConnectSSL("smtp.example.org");
    client.UseBestLogin("alice@example.org", "password");
    client.SendMessage(email);
    client.Close();
}
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
// C# fluent interface version
 
using Fluent = Limilabs.Mail.Fluent;
 
Fluent.Mail.Html(Template
              .FromFile("template.txt")
              .DataFrom(templateData)
              .Render())
    .From(new MailBox("alice@mail.com", "Alice"))
    .To(new MailBox("bob@mail.com", "Bob"))
    .Subject("Your order")
    .UsingNewSmtp()
    .WithCredentials("alice@example.org", "password")
    .Server("smtp.example.org")
    .WithSSL()
    .Send();
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
' VB.NET version
 
    Dim rendered As String = Template _
        .FromFile("template.txt") _
        .DataFrom(templateData) _
        .Render()
 
    Dim builder As MailBuilder = New MailBuilder()
    builder.Html = rendered
    builder.Subject = "Your order"
    builder.From.Add(New MailBox("alice@mail.com", "Alice"))
    builder.[To].Add(New MailBox("bob@mail.com", "Bob"))
    Dim email As IMail = builder.Create()
 
    Using client As Smtp = New Smtp()
        client.ConnectSSL("smtp.example.org")
        client.UseBestLogin("alice@example.org", "password")
        client.SendMessage(email)
        client.Close()
    End Using
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
' VB.NET fluent interface version
 
Imports Fluent = Limilabs.Mail.Fluent;
 
Fluent.Mail.Html(Template _
               .FromFile("template.txt") _
               .DataFrom(templateData) _
               .Render()) _
     .From(New MailBox("alice@mail.com", "Alice")) _
     .[To](New MailBox("bob@mail.com", "Bob")) _
     .Subject("Your order") _
     .UsingNewSmtp() _
     .WithCredentials("alice@example.org", "password") _
     .Server("smtp.example.org") _
     .WithSSL() _
     .Send()

You can also specify text version of the message, by using Text(string) method. In most cases this is unnecessary, as Mail.dll automatically extracts plain text from html and adds the plain text version to the email message.

And this is how the data (templateData variable), used by the template, look like:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
// C# version
 
public class Contact
{
    public List<order> Orders { get; private set; }
 
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool Verified;
    private string Password { get; set; }
 
    public Contact()
    {
        Orders = new List<order>();
    }
} ;
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
' VB.NET version
 
Public Class Contact
    Public Property Orders() As List(Of Order)
        Get
            Return m_Orders
        End Get
        Private Set
            m_Orders = Value
        End Set
    End Property
    Private m_Orders As List(Of Order)
 
    Public Property FirstName() As String
        Get
            Return m_FirstName
        End Get
        Set
            m_FirstName = Value
        End Set
    End Property
    Private m_FirstName As String
    Public Property LastName() As String
        Get
            Return m_LastName
        End Get
        Set
            m_LastName = Value
        End Set
    End Property
    Private m_LastName As String
    Public Verified As Boolean
    Private Property Password() As String
        Get
            Return m_Password
        End Get
        Set
            m_Password = Value
        End Set
    End Property
    Private m_Password As String
 
    Public Sub New()
        Orders = New List(Of Order)()
    End Sub
End Class

Tags:   

Questions?

Consider using our Q&A forum for asking questions.

6 Responses to “Email template engine”

  1. Uroš Says:

    This is a very usefull thing and easy to implement thanks to your tutorial! Great job.

  2. Martin Staael Says:

    I tried using DataFrom with a Dictionary but it doesn’t work. Would be nice to have

  3. Limilabs support Says:

    @Martin

    You can use Template.AddKey method:

    1
    2
    3
    4
    string s = Template
        .Create("Show some number [key].")
        .AddKey("key", "42")
        .Render();

    I’ve already implemented this feature, and it’ll be added in the next release.

  4. Send email to multiple recipients Says:

    […] Also take a look at Mail.dll’s templating engine […]

  5. Martin Says:

    How would an html template look if I needed a logo image (jpg or png) in the signature part of the email ?

  6. Limilabs support Says:

    @Martin,

    Your HTML must include img tag with src attribute set to content-id of the attached image:

    1
    <img src="cid:logo@example.com" />

    Also you need to add this image to Visuals collection:

    1
    2
    3
    4
    5
    MailBuilder builder = new MailBuilder();
    builder.Html = @"<img src=""cid:logo@example.com"" />";
    MimeData logo = builder.AddVisual(@"c:\image.jpg");
    logo.ContentId = "logo@example.com";
    IMail email = builder.Create();

    Using fluent interface:

    1
    2
    3
    4
    5
    IMail email = Fluent.Mail
        .Html(@"<img src=""cid:logo@example.com"" />")
        .AddVisual(@"c:\image.jpg")
        .SetContentId("logo@example.com")            
        .Create();

    You can find more details here:
    https://www.limilabs.com/blog/send-html-email