Módulo Smtp com modelo de Html

Todas as vezes que crio um novo projeto que precisa enviar emails acabo indo atrás de projetos anteriores e faço o famoso ctrl+C, ctrl+V mas recentemente cansei desse hábito horrendo e decidi criar uma biblioteca simples que pode ser referenciada em qualquer projeto.
Caso esteja com pressa, baixe a biblioteca aqui, ou o demo completo aqui.
Página do projeto no Github
Para testar o módulo, use Smtp4Dev.
Para começar, criei a classe que gerencia o SmtpClient e SmtpServer:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Web.Hosting;
namespace Simple_Mail
{
#region Enums
/// <summary>
/// Types of Emails that can be sent
/// </summary>
public enum EmailType
{
Default,
Confirmation,
Forgotten,
Welcome,
Error
}
/// <summary>
/// Type of Application this module is being ran from
/// </summary>
public enum ApplicationType
{
Desktop,
Web
}
#endregion
#region Class
/// <summary>
/// Email Module Class
/// </summary>
public class Email
{
#region Public Members
// <summary>
/// The Email address of the Email Module Admin
/// </summary>
public string SITE_ADMIN { get; set; }
/// <summary>
/// Subject of the Email
/// </summary>
public string SUBJECT { get; set; }
/// <summary>
/// Body of the Email (default is html)
/// </summary>
public string BODY { get; set; }
/// <summary>
/// From Email Address (who's sending the email)
/// </summary>
public string FROM { get; set; }
/// <summary>
/// From Name (name of who is sending the email)
/// </summary>
public string FROM_NAME { get; set; }
/// <summary>
/// To Email Address (who is going to receive this email)
/// </summary>
public string TO { get; private set; }
/// <summary>
/// To Name (name of who is going to receive this email)
/// </summary>
public string TO_NAME { get; set; }
/// <summary>
/// Username of Smtp Service / Server
/// </summary>
public string USERNAME { get; private set; }
/// <summary>
/// Password for the smtp service / server
/// </summary>
public string PASSWORD { get; private set; }
/// <summary>
/// The port number for sending the email address (normal ports are 25, 587, 465)
/// </summary>
public int PORT { get; private set; }
/// <summary>
/// Whether to use SSL Encryption
/// </summary>
public bool USESSL { get; private set; }
/// <summary>
/// Uri of the Smtp Server
/// </summary>
public string SERVER { get; private set; }
/// <summary>
/// Whether the smtp server requires authentication
/// </summary>
public bool REQUIREAUTH { get; private set; }
/// <summary>
/// Name of the Website or App running the Module
/// </summary>
public string WEBSITE_NAME { get; set; }
/// <summary>
/// Default Html Body for the Email
/// </summary>
public string HTML_DEFAULT { get; private set; }
/// <summary>
/// Html body for the Forgotten Email
/// </summary>
public string HTML_FORGOTEN { get; private set; }
/// <summary>
/// Html Body for the Confirmation Email
/// </summary>
public string HTML_CONFIRMATION { get; private set; }
/// <summary>
/// Html Body for the Welcome Email
/// </summary>
public string HTML_WELCOME { get; private set; }
/// <summary>
/// Html for the Social Share
/// </summary>
public string HTML_SHARE_PATH { get; private set; }
/// <summary>
/// Path for the Default Html File
/// </summary>
public string HTML_DEFAULT_PATH { get; private set; }
/// <summary>
/// Path for the Forgotten Html File
/// </summary>
public string HTML_FORGOTEN_PATH { get; private set; }
/// <summary>
/// Path for the Confirmation Html File
/// </summary>
public string HTML_CONFIRMATION_PATH { get; private set; }
/// <summary>
/// Path for the Welcome Html File
/// </summary>
public string HTML_WELCOME_PATH { get; private set; }
/// <summary>
/// Path for the Social Share Html File
/// </summary>
public string HTML_SHARE { get; private set; }
#endregion
#region Constructors
/// <summary>
/// Manually configures a Smtp Server Instance (when you do not want to use config files)
/// </summary>
/// <param name="smtpServer">The Uri for the smtp server</param>
/// <param name="smtpPort">The Smtp Port</param>
/// <param name="useAuth">Whether the Smtp Server Requires Authentication</param>
/// <param name="username">The Smtp Username</param>
/// <param name="password">The Smtp Password</param>
/// <param name="useSSL">Whether to Use SSL Encryption</param>
public Email(string smtpServer, int smtpPort, bool useAuth = false, string username = "", string password = "", bool useSSL = false)
{
SERVER = smtpServer;
PORT = smtpPort;
REQUIREAUTH = useAuth;
USERNAME = username;
PASSWORD = password;
USESSL = useSSL;
}
/// <summary>
/// Instanciates a new Email Module based on Config Files and Application Type (Web or Desktop)
/// </summary>
/// <param name="type"></param>
public Email(ApplicationType type)
{
switch (type)
{
case ApplicationType.Desktop:
HTML_CONFIRMATION_PATH = ConfigurationManager.AppSettings["email-html-confirmation"];
HTML_WELCOME_PATH = ConfigurationManager.AppSettings["email-html-welcome"];
HTML_FORGOTEN_PATH = ConfigurationManager.AppSettings["email-html-forgotten"];
HTML_DEFAULT_PATH = ConfigurationManager.AppSettings["email-html-default"];
HTML_SHARE_PATH = ConfigurationManager.AppSettings["email-html-share"];
break;
case ApplicationType.Web:
HTML_CONFIRMATION_PATH = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["email-html-confirmation"]);
HTML_WELCOME_PATH = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["email-html-welcome"]);
HTML_FORGOTEN_PATH = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["email-html-forgotten"]);
HTML_DEFAULT_PATH = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["email-html-default"]);
HTML_SHARE_PATH = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["email-html-share"]);
break;
default:
break;
}
HTML_CONFIRMATION = GetEmailHtml(HTML_CONFIRMATION_PATH);
HTML_WELCOME = GetEmailHtml(HTML_DEFAULT_PATH);
HTML_FORGOTEN = GetEmailHtml(HTML_FORGOTEN_PATH);
HTML_DEFAULT = GetEmailHtml(HTML_WELCOME_PATH);
HTML_SHARE = GetEmailHtml(HTML_SHARE_PATH);
WEBSITE_NAME = ConfigurationManager.AppSettings["WebsiteName"];
SITE_ADMIN = ConfigurationManager.AppSettings["siteadmin"];
SERVER = ConfigurationManager.AppSettings["email-server"];
PORT = int.Parse(ConfigurationManager.AppSettings["email-port"]);
USESSL = bool.Parse(ConfigurationManager.AppSettings["useSSL"]);
PASSWORD = ConfigurationManager.AppSettings["email-password"];
USERNAME = ConfigurationManager.AppSettings["email-username"];
REQUIREAUTH = bool.Parse(ConfigurationManager.AppSettings["email-require-auth"]);
TO_NAME = "New " + ConfigurationManager.AppSettings["WebsiteName"] + " Member";
TO = ConfigurationManager.AppSettings["email-to"];
FROM_NAME = ConfigurationManager.AppSettings["email-from-name"];
FROM = ConfigurationManager.AppSettings["email-from"];
SUBJECT = ConfigurationManager.AppSettings["email-subject"];
}
#endregion
#region Private Members
private EmailType emailMessageType;
private string emailMessageHtml;
private System.Net.Mail.SmtpClient SmtpServer;
#endregion
#region Private Methods
private string GetEmailHtml(string path)
{
return File.ReadAllText(path);
}
private string GetEmailFilePath(EmailType type)
{
emailMessageType = type;
switch (type)
{
case EmailType.Confirmation:
emailMessageHtml = HTML_CONFIRMATION;
break;
case EmailType.Forgotten:
emailMessageHtml = HTML_FORGOTEN;
break;
case EmailType.Welcome:
emailMessageHtml = HTML_WELCOME;
break;
case EmailType.Default:
emailMessageHtml = HTML_DEFAULT;
break;
default:
emailMessageHtml = "";
break;
}
return emailMessageHtml;
}
private bool SetupServer()
{
try
{
SmtpServer = new System.Net.Mail.SmtpClient();
SmtpServer.Port = PORT;
SmtpServer.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
if (REQUIREAUTH)
{
SmtpServer.UseDefaultCredentials = false;
SmtpServer.Credentials = new System.Net.NetworkCredential(USERNAME, PASSWORD);
}
else SmtpServer.UseDefaultCredentials = true;
SmtpServer.Host = SERVER;
SmtpServer.EnableSsl = USESSL;
return true;
}
catch
{
return false;
}
}
#endregion
#region Public Methods
/// <summary>
/// Attempts to send an email
/// </summary>
/// <param name="type">The Type of Email Being Sent</param>
/// <param name="custom">Whether to Customize the email</param>
/// <param name="body">If customized, set the html body for the email</param>
/// <param name="To">If customized, defines the TO field</param>
/// <param name="ToName">If customized, defines the To name</param>
/// <returns>Returns a KeyValuePair<bool,string> with success (true/false) and a message from the smtp server</returns>
public KeyValuePair<bool, string> SendMail(EmailType type, bool custom = false, string body = "", string To = "", string ToName = "New Member")
{
if (SetupServer())
{
System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
mail.Subject = SUBJECT;
mail.From = new System.Net.Mail.MailAddress(FROM, FROM_NAME);
mail.IsBodyHtml = true;
if (ToName != "") TO_NAME = ToName;
if (To == "") mail.To.Add(new System.Net.Mail.MailAddress(TO, TO_NAME));
else mail.To.Add(new System.Net.Mail.MailAddress(To, TO_NAME));
if (custom)
mail.Body = body;
else
{
BODY = GetEmailFilePath(type);
mail.Body = BODY;
}
try
{
SmtpServer.Send(mail);
return new KeyValuePair<bool, string>(true, "Email sent succesfully");
}
catch (Exception ex)
{
return new KeyValuePair<bool, string>(false, ex.Message);
}
finally
{
SmtpServer.Dispose();
}
}
else return new KeyValuePair<bool, string>(false, "Error Setting UP Email");
}
/// <summary>
/// Manually Sets the Body for the Email Message
/// </summary>
/// <param name="message">The Html Body for the Email</param>
public void SetBody(string message)
{
BODY = message;
}
#endregion
}
#endregion
}
Também inclui algumas configurações no App.Config como modelo, que podem ser usadas no Web.Config caso não queira inserir os dados via código.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<!--email provider section-->
<add key="siteadmin" value="postmaster@simpleemail.com"/>
<add key="email-subject" value="Email from Email Website"/>
<add key="email-from" value="postmaster@puul.ga"/>
<add key="email-from-name" value="Simple Email"/>
<add key="email-require-auth" value="false"/>
<add key="email-username" value="simpleemail"/>
<add key="email-password" value=""/>
<add key="email-port" value="3535"/>
<add key="useSSL" value="false"/>
<add key="email-server" value="localhost"/>
<add key="email-html-share" value="~/Email Templates/share.html"/>
<add key="email-html-default" value="~/Email Templates/default.html"/>
<add key="email-html-forgotten" value="~/Email Templates/default.html"/>
<add key="email-html-confirmation" value="~/Email Templates/default.html"/>
<add key="email-html-welcome" value="~/Email Templates/default.html"/>
</appSettings>
</configuration>
Mas como também havia interesse em mandar emails em html mais bonitos, usei um modelo do MailChimp™ para ficar mais apresentável. Inclui na pasta de “Email Templates”
<!--MAILCHIMP EMAIL TEMPLATE-->
<!--DON'T CHANGE THE *|VALUES|* AS THEY ARE REPLACED IN THE SERVER - CHANGE THE HTML, TEXT IS AUTOMATICALLY ADDED-->
<td align="center" valign="top" id="bodyCell" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;height: 100%;margin: 0;padding: 10px;width: 100%;border-top: 0;">
<!-- BEGIN TEMPLATE // -->
<!--[if gte mso 9]>
<table align="center" border="0" cellspacing="0" cellpadding="0" width="600" style="width:600px;">
<tr>
<td align="center" valign="top" width="600" style="width:600px;">
<![endif]-->
<table border="0" cellpadding="0" cellspacing="0" width="100%" class="templateContainer" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;border: 0;max-width: 600px !important;">
<tbody><tr>
<td valign="top" id="templatePreheader" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;background-color: #FAFAFA;border-top: 0;border-bottom: 0;padding-top: 9px;padding-bottom: 9px;"><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnTextBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody class="mcnTextBlockOuter">
<tr>
<td valign="top" class="mcnTextBlockInner" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<table align="left" border="0" cellpadding="0" cellspacing="0" width="366" class="mcnTextContentContainer" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td valign="top" class="mcnTextContent" style="padding-top: 9px;padding-left: 18px;padding-bottom: 9px;padding-right: 0;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;word-break: break-word;color: #656565;font-family: Helvetica;font-size: 12px;line-height: 150%;text-align: left;">
*|EMAIL_PREVIEW|*
</td>
</tr>
</tbody></table>
<table align="right" border="0" cellpadding="0" cellspacing="0" width="197" class="mcnTextContentContainer" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td valign="top" class="mcnTextContent" style="padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;word-break: break-word;color: #656565;font-family: Helvetica;font-size: 12px;line-height: 150%;text-align: left;">
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody>
</table></td>
</tr>
<tr>
<td valign="top" id="templateHeader" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;background-color: #FFFFFF;border-top: 0;border-bottom: 0;padding-top: 9px;padding-bottom: 0;"><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnImageBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody class="mcnImageBlockOuter">
<tr>
<td valign="top" style="padding: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;" class="mcnImageBlockInner">
<table align="left" width="100%" border="0" cellpadding="0" cellspacing="0" class="mcnImageContentContainer" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td class="mcnImageContent" valign="top" style="padding-right: 9px;padding-left: 9px;padding-top: 0;padding-bottom: 0;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<table style="width: 564px;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;" class="mcpreview-image-uploader"></table>
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody>
</table></td>
</tr>
<tr>
<td valign="top" id="templateBody" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;background-color: #FFFFFF;border-top: 0;border-bottom: 2px solid #EAEAEA;padding-top: 0;padding-bottom: 9px;"><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnTextBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody class="mcnTextBlockOuter">
<tr>
<td valign="top" class="mcnTextBlockInner" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<table align="left" border="0" cellpadding="0" cellspacing="0" width="100%" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;" class="mcnTextContentContainer">
<tbody><tr>
<td valign="top" class="mcnTextContent" style="padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;word-break: break-word;color: #202020;font-family: Helvetica;font-size: 16px;line-height: 150%;text-align: left;">
<h1 style="display: block;margin: 0;padding: 0;color: #202020;font-family: Helvetica;font-size: 26px;font-style: normal;font-weight: bold;line-height: 125%;letter-spacing: normal;text-align: left;">
*|HEADER|*
</h1>
<p style="margin: 10px 0;padding: 0;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #202020;font-family: Helvetica;font-size: 16px;line-height: 150%;text-align: left;">
*|FIRSTPARAGRAPH|*
</p>
<p style="margin: 10px 0;padding: 0;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #202020;font-family: Helvetica;font-size: 16px;line-height: 150%;text-align: left;">
*|SECONDPARAGRAPH|*
</p>
<p style="margin: 10px 0;padding: 0;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #202020;font-family: Helvetica;font-size: 16px;line-height: 150%;text-align: left;">
If you need a bit of inspiration, you can
<a href="http://inspiration.mailchimp.com" class="mc-template-link" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #2BAADF;font-weight: normal;text-decoration: underline;">
see what other MailChimp users are doing
</a>, or <a href="http://mailchimp.com/resources/email-design-guide/" class="mc-template-link" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;color: #2BAADF;font-weight: normal;text-decoration: underline;">
learn about email design
</a>
and blaze your own trail.
</p>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td valign="top" id="templateFooter" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;background-color: #FAFAFA;border-top: 0;border-bottom: 0;padding-top: 9px;padding-bottom: 9px;"><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnFollowBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody class="mcnFollowBlockOuter">
<tr>
<td align="center" valign="top" style="padding: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;" class="mcnFollowBlockInner">
<table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnFollowContentContainer" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td align="center" style="padding-left: 9px;padding-right: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;" class="mcnFollowContent">
<tbody><tr>
<td align="center" valign="top" style="padding-top: 9px;padding-right: 9px;padding-left: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<table align="center" border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td align="center" valign="top" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<!--[if mso]>
<table align="center" border="0" cellspacing="0" cellpadding="0">
<tr>
<![endif]-->
<!--[if mso]>
<td align="center" valign="top">
<![endif]-->
<table align="left" border="0" cellpadding="0" cellspacing="0" style="display: inline;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td valign="top" style="padding-right: 10px;padding-bottom: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;" class="mcnFollowContentItemContainer">
<table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnFollowContentItem" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td align="left" valign="middle" style="padding-top: 5px;padding-right: 10px;padding-bottom: 5px;padding-left: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<table align="left" border="0" cellpadding="0" cellspacing="0" width="" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td align="center" valign="middle" width="24" class="mcnFollowIconContent" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<a href="http://www.twitter.com/" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"><img src="http://cdn-images.mailchimp.com/icons/social-block-v2/color-twitter-48.png" style="display: block;border: 0;height: auto;outline: none;text-decoration: none;-ms-interpolation-mode: bicubic;" height="24" width="24" class=""></a>
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
<!--[if mso]>
</td>
<![endif]-->
<!--[if mso]>
<td align="center" valign="top">
<![endif]-->
<table align="left" border="0" cellpadding="0" cellspacing="0" style="display: inline;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td valign="top" style="padding-right: 10px;padding-bottom: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;" class="mcnFollowContentItemContainer">
<table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnFollowContentItem" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td align="left" valign="middle" style="padding-top: 5px;padding-right: 10px;padding-bottom: 5px;padding-left: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<table align="left" border="0" cellpadding="0" cellspacing="0" width="" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td align="center" valign="middle" width="24" class="mcnFollowIconContent" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<a href="http://www.facebook.com" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"><img src="http://cdn-images.mailchimp.com/icons/social-block-v2/color-facebook-48.png" style="display: block;border: 0;height: auto;outline: none;text-decoration: none;-ms-interpolation-mode: bicubic;" height="24" width="24" class=""></a>
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
<!--[if mso]>
</td>
<![endif]-->
<!--[if mso]>
<td align="center" valign="top">
<![endif]-->
<table align="left" border="0" cellpadding="0" cellspacing="0" style="display: inline;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td valign="top" style="padding-right: 0;padding-bottom: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;" class="mcnFollowContentItemContainer">
<table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnFollowContentItem" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td align="left" valign="middle" style="padding-top: 5px;padding-right: 10px;padding-bottom: 5px;padding-left: 9px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<table align="left" border="0" cellpadding="0" cellspacing="0" width="" style="border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td align="center" valign="middle" width="24" class="mcnFollowIconContent" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<a href="http://mailchimp.com" target="_blank" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;"><img src="http://cdn-images.mailchimp.com/icons/social-block-v2/color-link-48.png" style="display: block;border: 0;height: auto;outline: none;text-decoration: none;-ms-interpolation-mode: bicubic;" height="24" width="24" class=""></a>
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
<!--[if mso]>
</td>
<![endif]-->
<!--[if mso]>
</tr>
</table>
<![endif]-->
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody>
</table><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnDividerBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;table-layout: fixed !important;">
<tbody class="mcnDividerBlockOuter">
<tr>
<td class="mcnDividerBlockInner" style="min-width: 100%;padding: 10px 18px 25px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<table class="mcnDividerContent" border="0" cellpadding="0" cellspacing="0" width="100%" style="min-width: 100%;border-top-width: 2px;border-top-style: solid;border-top-color: #EEEEEE;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody><tr>
<td style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<span></span>
</td>
</tr>
</tbody></table>
<!--
<td class="mcnDividerBlockInner" style="padding: 18px;">
<hr class="mcnDividerContent" style="border-bottom-color:none; border-left-color:none; border-right-color:none; border-bottom-width:0; border-left-width:0; border-right-width:0; margin-top:0; margin-right:0; margin-bottom:0; margin-left:0;" />
-->
</td>
</tr>
</tbody>
</table><table border="0" cellpadding="0" cellspacing="0" width="100%" class="mcnTextBlock" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<tbody class="mcnTextBlockOuter">
<tr>
<td valign="top" class="mcnTextBlockInner" style="mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;">
<table align="left" border="0" cellpadding="0" cellspacing="0" width="100%" style="min-width: 100%;border-collapse: collapse;mso-table-lspace: 0pt;mso-table-rspace: 0pt;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;" class="mcnTextContentContainer">
<tbody><tr>
<td valign="top" class="mcnTextContent" style="padding-top: 9px;padding-right: 18px;padding-bottom: 9px;padding-left: 18px;mso-line-height-rule: exactly;-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%;word-break: break-word;color: #656565;font-family: Helvetica;font-size: 12px;line-height: 150%;text-align: center;">
<em>Copyright © *|CURRENT_YEAR|* *|LIST:COMPANY|*, All rights reserved.</em>
<br>
<br>
<br>
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody>
</table></td>
</tr>
</tbody></table>
<!--[if gte mso 9]>
</td>
</tr>
</table>
<![endif]-->
<!-- // END TEMPLATE -->
</td>
Para usar o módulo, instancia-se desta forma
Email _email = new Email(ApplicationType.Web);
string defaultHtml = _email.HTML_CONFIRMATION;
string body = defaultHtml
.Replace("*|EMAIL_PREVIEW|*", "This is a Simple Email")
.Replace("*|HEADER|*", "Simple Email Website")
.Replace("*|FIRSTPARAGRAPH|*", "The message below has been customized")
.Replace("*|SECONDPARAGRAPH|*", Message)
.Replace("*|WEBSITE_URL|*", Request.Url.ToString())
.Replace("*|WEBSITE_NAME|*", _email.WEBSITE_NAME)
.Replace("*|CURRENT_YEAR|*", DateTime.Now.Year.ToString());
_email.SendMail(EmailType.Confirmation, true, body, Email);
Basicamente, está criado um módulo que pode ser reusado em outros projetos, sem o horrendo copy/paste. Claro, melhorias sempre podem ser feitas, por isso o projeto é open source e pode ser baixado do Github.
Para testar a funcionalidade, recomendo usar Smtp4Dev que é bastante prático e não requer nem instalação.