Skip to main content

Send Templated Emails Using MailDefinition Object in asp.net

Sending Email using Templates Asp.net:

Previous post explained about the Sending Email from Asp.net With Dynamic Content

 Recently I Was found a better way to format my email messages in ASP.NET using the MailDefinition object. It lets you to use an email template and define tokens which you want to replace in it. This helps keep the presentation and business layers clean & separate and lets the designers go in and edit the email templates without having to navigate the StringBuilder.

This article explains how to send email using ASP.NET. Yes, there are many other articles that cover sending email via .NET, I found that many articles suggest you create your HTML email using a string with the HTML markup in it. In this article we will look at a more detailed solution. One in which we use a regular HTML file as our template for the email. The template file will be a standard HTML file with the exception of some placeholders that we will use to populate our content and images right before we send the email. Think mail-merge in Microsoft Word. Finally, we will also learn how to send the email in such a way that if the email recipient's mail-client can't render HTML then they will get an alternate plain text version.


Here’s how its done.


private void SendEmail()
{
 Customer customer = CustomerData.GetCustomer(2);
 
 MailDefinition mailDefinition = new MailDefinition();
 mailDefinition.BodyFileName = "~/Email-Templates/Order-Confirmation.html";
 mailDefinition.From = "no-reply@gmail.com";

 //Create a key-value collection of all the tokens you want to replace in your template...
 ListDictionary ldReplacements = new ListDictionary();
 ldReplacements.Add("<%FirstName%>", customer.FirstName);
 ldReplacements.Add("<%LastName%>", customer.LastName);
 ldReplacements.Add("<%Address1%>", customer.Address1);
 ldReplacements.Add("<%Address2%>", customer.Address2);
 ldReplacements.Add("<%City%>", customer.City);
 ldReplacements.Add("<%State%>", customer.State);
 ldReplacements.Add("<%Zip%>", customer.Zip);

 string mailTo = string.Format("{0} {1} <{2}>", customer.FirstName, customer.LastName, customer.EmailAddress);
 MailMessage mailMessage = mailDefinition.CreateMailMessage(mailTo, ldReplacements, this);
 mailMessage.From = new MailAddress("no-reply@my-site.com", "My Site");
 mailMessage.IsBodyHtml = true;
 mailMessage.Subject = "Order Confirmation";

 SmtpClient smtpClient = new SmtpClient(ConfigurationManager.AppSettings["SMTPServer"].ToString(), 25);
 smtpClient.Send(mailMessage);
}
Your email template could be of any extension (txt, html, etc) as long as its in a text format. I personally like to keep it in HTML format so that we can preview the email template in a browser. Basically it’ll looks something like this -



Hello <%FirstName%> <%LastName%>,

Thank you for creating an account with us. Here are your details:

<%Address1%>,
<%Address2%>
<%City%>, <%State%> <%Zip%>

Thank You,
My Site


Change the web.config file mail settings like bellow  for setting mail host details 
<system.net>
    <mailSettings>
      <smtp from="ramakrishna.p@gmail.com">
        <network host="smtp.gmail.com"  />
      </smtp>
    </mailSettings>
  </system.net>
Remarks
The MailDefinition class can be used by controls to create a MailMessage object from a text file or a string that contains the body of the e-mail message. Use the MailDefinitionclass to simplify creating predefined e-mail messages to be sent by a control. If you want to send e-mail not using a control, see the System.Net.mail class.
You can make text substitutions in the body of the e-mail message by passing to the CreateMailMessage method an IDictionary instance that maps strings to their replacements.
Small Note :
The MailDefinition class does not support data binding. Properties of the MailDefinition class cannot be bound to data using the <%#   %> data-binding expression syntax.

Comments

Popular posts from this blog

Asp.Net AjaxFileUpload Control With Drag Drop And Progress Bar

This Example explains how to use AjaxFileUpload Control With Drag Drop And Progress Bar Functionality In Asp.Net 2.0 3.5 4.0 C# And VB.NET. Previous Post  I was Explained about the   jQuery - Allow Alphanumeric (Alphabets & Numbers) Characters in Textbox using JavaScript  ,  Fileupload show selected file in label when file selected  ,  Check for file size with JavaScript before uploading  . May 2012 release of AjaxControlToolkit includes a new AjaxFileUpload Control  which supports Multiple File Upload, Progress Bar and Drag And Drop functionality. These new features are supported by Google Chrome version 16+, Firefox 8+ , Safari 5+ and Internet explorer 10 + , IE9 or earlier does not support this feature. To start with it, download and put latest AjaxControlToolkit.dll in Bin folder of application, Place ToolkitScriptManager  and AjaxFileUpload on the page. HTML SOURCE < asp:ToolkitScriptManager I...

View online files using the Google Docs Viewer

Use Google Docs Viewer for Document viewing within Browser I was looking for a way to let users see Microsoft Word Doc or PDF files online while using my application without leaving their browser without downloading files and then opening it to view with Word or PDF viewer . I was looking for some way out either via any PHP or Microsoft.NET libraries, did some googling on that; but later on I just got an idea that google already has all code written for me.. when I have any email attachment in PDF or DOC or DOCX google does it for me ..! Even while searching I can see PDFs by converting them in HTML. So I just googled it up and found that Google already has this ability that we can use Google Docs Viewer without any Google Account Login . YES that's true no Google Account login is required. It's damn simple and easy. Just pass document path as attachment as parameter and we are done. Google Docs Viewer gives us ability to embed PDF, DOC/DOCX, PPT, TIFF:...

How to send mail asynchronously in asp.net with MailMessage

With Microsoft.NET Framework 2.0 everything is asynchronous and we can send mail also asynchronously. This features is very useful when you send lots of bulk mails like offers , Discounts , Greetings . You don’t have to wait for response from mail server and you can do other task . By using     SmtpClient . SendAsync Method (MailMessage, Object)    you need to do  System.Net.Mail has also added asynchronous support for sending email. To send asynchronously, you need need to Wire up a SendCompleted event Create the SendCompleted event Call SmtpClient.SendAsync smtpClient.send() will initiate the sending on the main/ui  thread and would block.  smtpClient.SendAsync() will pick a thread from the .NET Thread Pool and execute the method on that thread. So your main UI will not hang or block . Let's create a simple example to send mail. For sending mail asynchronously you need to create a event handler that will notify that mail success...