Update: The “Replace” method of templating in Fluent Email has itself been replaced by a Razor Engine Template. See Luke’s Post here about it.
I always seem to forget how to send emails in .NET which to me seems like such a simple task. Lately I’ve been working on updating an older application of mine that’s soul purpose was to read a database and send emails depending on certain events. I had a look at the current code and saw something like this:
sb.Append("A Transaction has been made...<br />");
sb.Append("<table><tr><th>Reservation Number</th><th>Customer Name</th><th>Email</th><th>Sale Date</th><th>Amount</th></tr>");
sb.AppendFormat("<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td></tr>",
transaction.Reservation, transaction.FullName, transaction.Email, transaction.SaleDate, transaction.Amount.ToString("C2"));
sb.AppendFormat("<tr><th>Invoice</th><th>Confirmation</th></tr><tr><td>{0}</td><td>{1}</td></tr></table>", transaction.Invoice, transaction.Confirmation);
Terrible! So I figured while I was updating it I'd work out a better way build up the HTML of the emails. I started with the FluentEmail Project (Luke’s Post about it). From there I added some basic templating features, such as loading a HTML file with placeholders for content and the rest is history…
With my recent updated to FluentEmail I was about to turn something that looked like the above code to this: (as always C# is the code of choice)
//Send Email!
var email = Email
.From(_fromEmail)
.To(toAddresses)
.Subject(string.Format("Siriusware Emailer Confirmation #{0}", transaction.Confirmation))
.UsingTemplate(@"C:\Emailer\TransactionTemplate.htm")
.Replace("<%Reservation%>", transaction.Reservation)
.Replace("<%FullName%>", transaction.FullName)
.Replace("<%SaleDate%>", transaction.SaleDate.ToShortDateString())
.Replace("<%Amount%>", transaction.Amount.ToString("C2"))
.Replace("<%Invoice%>", transaction.Invoice)
.Replace("<%Confirmation%>", transaction.Confirmation)
.UsingClient(new SmtpClient(_mailhost));
email.Send();
The HTML inside TransactionTemplate.htm has the below code. This is a basic example but demonstrates the usage of the templates.
<html>
<head>
<title></title>
</head>
<body>
A Transaction has been made...<br />
<table>
<tr>
<th>Reservation Number</th>
<th>Customer Name</th>
<th>Email</th>
<th>Sale Date</th>
<th>Amount</th>
</tr>
<tr>
<td><%Reservation%></td>
<td><%FullName%></td>
<td><%Email%></td>
<td><%SaleDate%></td>
<td><%Amount%></td>
</tr>
<tr>
<th>Invoice</th>
<th>Confirmation</th>
</tr>
<tr>
<td><%Invoice%></td>
<td><%Confirmation%></td>
</tr>
</table>
</body>
</html>
Pretty damn easy if you ask me.
This also give me the flexibility to edit the HTML file in a proper editor instead of concatenating all those strings together. The main idea was inspired by the MailDefinition class built into .NET but I didnt like the face that: 1 it was part of the System.Web.UI.WebControls namespace when its not a Web Control and wouldnt be used as one. And 2, It attempted to use another Control as a worker for it. So I just extended MailMessage to add the functionality.
All you need to do is download FluentEmail from Github