Saturday, September 14, 2013

Email Sending Library

Introduction

This is an small library which will enable your website / web application to send emails instantly. This is fully tested code and provides quick integration.

Background

Today’s application are not just software but a solution. In this solution we always had a need to communicate to the user. There are various ways of communicating, Email is one of them and is widely used. All developers must have felt the need to integrate an email sending option in their solution. If you google you will find various samples, tutorials and articles of doing so. They impart good amount of knowledge. However, developing email sending feature for your project will take good amount of time.  

Using the code

The library uses a single method SendMail for performing the email sending feature. There are five steps involved in the sending feature.
Step One 
//Step 1: Create Mail client, Mail message, Mail addresses.
SmtpClient MailClient = new SmtpClient();
MailMessage Email = new MailMessage();
MailAddress FromMailAddress = new MailAddress(EmailDetails.EmailFrom, EmailDetails.EmailDisplayName);
MailAddress ReplyToMailAddress = new MailAddress(EmailDetails.EmailFrom, EmailDetails.EmailDisplayName);
MailAddress[] ToMailAddress = new MailAddress[EmailDetails.EmailTo.Length]; 
The System.Net.Mail namespece provides with four classes namely SmtpClient, MailMessage, MailAddress and Attachment which will be used for sending email. In this step we create instances of SmtpClient, MailMessage and MailAddress. Here we creating two instances of MailAddress class to allow specify Sender's Email information and Reply to Email information seperately. We have created an array of MailAddress for Recipient's Email to allow multiple email addresses.  
Step Two 
//Step 2: Set the Mail client credentials and enable SSL.
MailClient.Host = ConfigurationManager.AppSettings["EmailHost"];
MailClient.Port = Convert.ToInt32(ConfigurationManager.AppSettings["EmailPort"]);
MailClient.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["EmailUsername"], ConfigurationManager.AppSettings["EmailPassword"]);
MailClient.EnableSsl = true;  
In this step email server details with credentials are set. All these are taking from <appSettings>. The following settings are added to the web.config file from where the library will get the information. 
Settings (web.config)
<appSettings>
    <add key="EmailFrom" value="tester000@gmail.com"/>
    <add key="EmailUsername" value="tester000@gmail.com"/>
    <add key="EmailPassword" value="tester1234"/>
    <add key="EmailHost" value="smtp.gmail.com"/> 
    <add key="EmailPort" value="587"/>
</appSettings> 
Since the library takes the settings from web.config no changes to the code are required. 
Note: The setting name should exactly be same as mentioned in the settings block above.
Step Three
//Step 3: Set all Email options.
Email.From = FromMailAddress;
Email.ReplyTo = ReplyToMailAddress;
Email.Subject = EmailDetails.EmailSubject;
Email.Body = EmailDetails.EmailContents;
Email.IsBodyHtml = true;
for (int i = 0; i < ToMailAddress.Length; i++)
{
                    string EmailDisplayName = string.IsNullOrEmpty(EmailDetails.EmailToDisplayName[i]) ? "Recepient " + i.ToString() : EmailDetails.EmailToDisplayName[i];
                    ToMailAddress[i] = new MailAddress(EmailDetails.EmailTo[i], EmailDisplayName);
                    Email.To.Add(ToMailAddress[i]);
}  
Now all the options required for sending email are set the Sender, Recipients, Subject and Body. Since there can be multiple Recipients, a for loop all of them to MailMessage.
Step Four
//Step 4: Set all the attachments.
if (EmailDetails.EmailAttachments!=null)
{
 Attachment EmailAttachment = null;
 for (int i = 0; i < EmailDetails.EmailAttachments.Length; i++)
 {
  EmailAttachment = new Attachment(EmailDetails.EmailAttachments[i]);
                Email.Attachments.Add(EmailAttachment);
 }
}  
Now all attachments are added to the MailMessage. If there are no attachments pass null and the attachment adding step is skipped.
Step Five
//Step 5: Send Email.
MailClient.Send(Email);
Status = true; 
This is the final step where email is sent. The Send method doesn't return anything. In case it fails it throws an exception. The exception is captured and false status is returned to the calling method. A boolean value is returned indicating whether sending was success or failure.

The attached sample contains a sample web form with the method call and also the library source code. This library can be used by adding reference to the library(dll) in other projects.
To send email, simply call SendEmail method as mentioned below 
Method Call
ResultLBL.Text = SLEmail.SendEmail(ToTBX.Text, "Tester", SubjectTBX.Text, BodyTBX.Text, null, true).ToString(); 
Parameters 
  • Recipient's Email
  • Recipient's Name
  • Subject
  • Body of Email 
  • Attachments
  • Whether the Email service uses SSL?

Points of Interest

We always look at software reusability. I used to copy paste this code in all my applications and would ideally change the Email Server Credentials and other related details in the code. I learned how I can create a library(dll) which can be reused and made pluggable by reading the Email Server Credentials and other related details from a config file rather than editing the code.

Using class object as parameter to pass values which avoids changes to the method definition and method call. Also, we need not worry about the sequence. You can simply add members to class when you need to add parameters. 

History

I would welcome suggestions from all of you. Also, planning to enhance this library with more capabilities.