I recently found a better way to format my email messages in ASP.NET; using the MailDefinition object. Lets you use an email template and define tokens that 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. I think that any modern piece of software today, needs to send e-mail. Whether it being password recovery e-mails, rich reports, newsletters or anything else, being able to easily see and customize the look and feel of your e-mails is vital.
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.
This is how it's done.
The following is the SendEmail method:
- private void SendEmail()
- {
- Customer customer = CustomerData.GetCustomer(2);
- MailDefinition mailDefinition =new MailDefinition();
- mailDefinition.BodyFileName = "~/Email-Templates/Order-Confirmation.html";
- mailDefinition.From ="[email protected]";
-
- 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("[email protected]","test site");
- mailMessage.IsBodyHtml = true;
- mailMessage.Subject ="Order Details";
- SmtpClient smtpClient = new SmtpClient(ConfigurationManager.AppSettings["SMTPServer"].ToString(), 25);
- smtpClient.Send(mailMessage);
- }
Your email template could be of any extension (txt, html, and so on) 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 as in the following for setting mail host details:
- <system.net>
- <mailSettings>
- <smtpfrom="[email protected]">
- <networkhost="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.