Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Email System Using ASP.NET

0.00/5 (No votes)
15 Nov 2005 3  
The article explores the SMTP concepts, configuration and simple mail service.

Introduction

This article explores the features of an email system developed in a simple manner and shows how to create a simple mail service without taking much effort. I am confident that whoever reads this article will get a fairly good idea about the email service and the concepts behind the mail server which is based on SMTP.

The problem

How often you come across problems that are caused due to the lack of technical knowledge and the core concepts behind the framework. This article explores the concepts behind the mail server in a most simple manner. The article:

  • Explores the configuration settings of a mail server using SMTP.
  • Describes the code in a very interesting and simple manner.
  • Describes the settings to be done for hosting it in a web server.
  • Describes the solutions to the problems that occur during runtime.

Exploring the technology

SMTP stands for Simple Mail Transfer Protocol. The emails are sent using this perfect protocol. The .NET Framework supplies the SMTP class that enables you to send simple e-mail messages. If you have to send an e-mail with added functionalities, you have to make use of the MailMessage class. With the help of this class, you can insert attachments, set priorities, etc. very easily. You can also send HTML e-mail using this class.

Pre-requisites for the mail server

First of all, you have to check whether the SMTP service is enabled in the IIS which is the Internet Information service (it's a Windows component shipped with the operating system). You can check this service in the Add/Remove section seen in the control panel:

Click the Windows Component in the Add/Remove Programs section and you will get the screen shown below:

See whether IIS is checked or not, if it is checked (installed) click IIS (Internet Information Services) and you will get the screen shown below:

Then, check whether the SMTP service is installed or not. If the service is not available, you have to select the SMTP service and follow the wizard. Sometimes it may ask for the Windows XP CD for installing the Windows component. Now the SMTP mail service is available for the application.

Configuration and settings

For configuring the SMTP server you have to follow the steps given below:

  1. Go to>Start Menu>Control Panel>Administrator Tools>Internet Information Services.
  2. Click the Internet Information Services and locate the Default SMTP Virtual Server.
  3. Right click the same and go to the properties as seen below:

    Do the settings as per the figure by selecting your own IP address.

  4. Then go to the Access option in the tab menu and click Relay Restrictions. In Relay you will see the screen shown below and now configure accordingly:

    In the Access tab you have to configure the connection property also, as per the figure shown below and leave all the other settings as it is:

    The IP address 127.0.0.1 represents the localhost. Now you are ready for the application.

Code snippets

The code snippet for this project is explained below:

private void SendMail()
{
  try
   {
     MailMessage Email=new MailMessage(); //Creating the Mail Message 

                                          //object.

     Email.To=txtTo.Text;                 //Storing the To value in 

                                          //the object.

     Email.From=txtFrom.Text;             //Storing the From value 

                                          //in the object.

     Email.Cc=txtCC.Text;                 //Storing the CC value in 

                                          //the object.

     Email.Bcc=txtBCC.Text;               //Storing the BCC value in 

                                          //the object.

     Email.Subject=txtSubject.Text;       //Storing the Subject value 

                                          //in the object.

     Email.Body=txtMessage.Text;          //Specifies the email body.

     Email.Priority=MailPriority.High;    //Setting priority to the mail 

                                          //as high,low,or normal

     Email.BodyFormat=MailFormat.Text;    //Formatting the mail as html 

                                          //or text.


     //Checking whether the attachment is needed or not.

     if(rbtnAttach.Checked)
     {
       //Adding attachment to the mail.

       Email.Attachments.Add(
                  new MailAttachment(FileBrowse.Value));

     }
     //Specifying the real SMTP Mail Server.

     SmtpMail.SmtpServer.Insert(0,"127.0.0.1");
     SmtpMail.Send(Email);                //Sending the mail.

     Reset();                             //calling the reset method to 

                                          //erase the text entered.

     lblMessage.ForeColor=Color.Navy;
     lblMessage.Text=
         "*Your email has been sent successfully-Thank You";
   }
   //Handling the Exception

   catch(Exception exc)
   {
     lblMessage.Text="Send error:"+exc.ToString();
     lblMessage.ForeColor=Color.Red;
   }
}

Call the SendMail() method in the Click event of the button as shown below:

private void btnSend_Click(object sender, System.EventArgs e)
{
  SendMail();
}

The code block in the Reset() method is given below:

private void Reset()
{
   //Seeking for the controls in the active webform.

   Control myForm=Page.FindControl("Form1");
   //Iterating each control.

   foreach(Control ctl in myForm.Controls)
   {
      // Checking whether it is a text box 

      // and clear when it is a textbox

      if(ctl.GetType().ToString().Equals("System.Web.UI.WebControls.TextBox"))
      ((TextBox)ctl).Text="";
   }
}

Call the Reset() method in another Click event of the button as shown below:

private void btnCancel_Click(object sender, System.EventArgs e)
{
    Reset();
}

Final solution

Our code now looks like this:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Web.Mail;
namespace Email
{
    /// <summary>

    /// Summary description for WebForm1.

    /// </summary>

    public class WebForm1 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Label lblFrom;
        protected System.Web.UI.WebControls.Label lblCC;
        protected System.Web.UI.WebControls.TextBox txtFrom;
        protected System.Web.UI.WebControls.TextBox txtCC;
        protected System.Web.UI.WebControls.TextBox txtTo;
        protected System.Web.UI.WebControls.Label lblTo;
        protected System.Web.UI.WebControls.Label lblEmailService;
        protected System.Web.UI.WebControls.TextBox txtBCC;
        protected System.Web.UI.WebControls.Label lblBCC;
        protected System.Web.UI.WebControls.Label lblSubject;
        protected System.Web.UI.WebControls.TextBox txtSubject;
        protected System.Web.UI.WebControls.Label lblMessage;
        protected System.Web.UI.WebControls.TextBox txtMessage;
        protected System.Web.UI.WebControls.Button btnSend;
        protected System.Web.UI.HtmlControls.HtmlInputFile FileBrowse;
        protected System.Web.UI.WebControls.Label lblAttachment;
        protected System.Web.UI.WebControls.RadioButton rbtnAttach;
        protected System.Web.UI.WebControls.RadioButton rbtnDetachment;
        protected System.Web.UI.WebControls.Button btnCancel;
        public string strAttachment;
        
        private void Page_Load(object sender, System.EventArgs e)
        {
            lblMessage.Text="";
        }
        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            //

            // CODEGEN: This call is required by the 

            // ASP.NET Web Form Designer.

            //

            InitializeComponent();
            base.OnInit(e);
        }
        
        /// <summary>

        /// Required method for Designer support - do not modify

        /// the contents of this method with the code editor.

        /// </summary>

        private void InitializeComponent()
        { 
            this.rbtnDetachment.CheckedChanged += 
               new System.EventHandler(this.rbtnDetachment_CheckedChanged);
            this.btnCancel.Click += 
                new System.EventHandler(this.btnCancel_Click);
            this.btnSend.Click += 
                new System.EventHandler(this.btnSend_Click);
            this.rbtnAttach.CheckedChanged += 
                new System.EventHandler(this.rbtnAttach_CheckedChanged);
            this.Load += new System.EventHandler(this.Page_Load);
        }
        #endregion
        
        //Method for sending the email

        //***************************************************************

        private void SendMail()
        {
            try
            {
                //Creating the Mail Message object.

                MailMessage Email=new MailMessage();
                //Storing the To value in the object reference.

                Email.To=txtTo.Text;                
                //Storing the From value in the object reference.

                Email.From=txtFrom.Text;
                //Storing the CC value in the object reference.

                Email.Cc=txtCC.Text;
                //Storing the BCC value in the object reference.

                Email.Bcc=txtBCC.Text;
                //Storing the Subject value in the object reference.

                Email.Subject=txtSubject.Text;
                //Specifies the email body.

                Email.Body=txtMessage.Text;
                //Setting priority to the mail as high,low,or normal

                Email.Priority=MailPriority.High;
                //Formatting the mail as html or text.

                Email.BodyFormat=MailFormat.Text;
                //Checking whether the attachment is needed or not.

                if(rbtnAttach.Checked)
                {
                    //Adding attachment to the mail.

                    Email.Attachments.Add(
                        new MailAttachment(FileBrowse.Value));
                }
                //specifying the real SMTP Mail Server.

                SmtpMail.SmtpServer.Insert(0,"127.0.0.1");
                SmtpMail.Send(Email);//Sending the mail.

                //calling the reset method to erase all the data 

                //after sending the mail.

                Reset();
                lblMessage.ForeColor=Color.Navy;
                //User information after submission.

                lblMessage.Text=
                  "*Your email has been sent successfully-Thank You";
            }
            //Catching Exception 

            catch(Exception exc)
            { 
                Reset();
                lblMessage.Text="Send error:"+exc.ToString();
                lblMessage.ForeColor=Color.Red;
            }
        }
        //Method to reset the text fields.

        //***********************************************************

        private void Reset()
        {
            //Seeking for the controls in the active webform.

            Control myForm=Page.FindControl("Form1");
            //Iterating each control.

            foreach(Control ctl in myForm.Controls)
            {
                //Checking whether it is a text

                //box and clear when it is a textbox.

                if(ctl.GetType().ToString().Equals(
                            "System.Web.UI.WebControls.TextBox")) 
                                                                 
                ((TextBox)ctl).Text="";
            }
        }
        //Event fires for sending the mail.

        //***********************************************************

        private void btnSend_Click(object sender, System.EventArgs e)
        {
            SendMail();
        }
        //Event for cancelling the mail.

        //***********************************************************

        private void btnCancel_Click(object sender, System.EventArgs e)
        {
            Reset();
        }
        //Event for enabling or disabling the File browser.

        //************************************************************

        private void rbtnAttach_CheckedChanged(object sender, 
                                                  System.EventArgs e)
        {
            FileBrowse.Disabled=false;
        }
        //Event for enabling or disabling the File browser.

        //************************************************************

        private void rbtnDetachment_CheckedChanged(object sender, 
                                                        System.EventArgs e)
        {
            FileBrowse.Disabled=true;
        }
        //*************************************************************

    }
}

Using the solution

Download the source code files given above in the zip format and copy the contents into the root directory (e.g. C:\Inetpub\wwwroot). Go to the Internet Information Services and create a virtual directory named EmailSystem and give the correct path for mapping.

Solutions for some problems

The Error "Could not access 'CDO.Message' object"

Solution1

Specify a valid mail server for the SmtpMail.SmtpServer property. If that property is not set, set it to 127.0.0.1 or localhost. For example: SmtpMail.SmtpServer = "127.0.0.1".

Solution2

If you are using "localhost" or "127.0.0.1" as the SmtpMail.SmtpServer, you may not have permissions to relay through the IIS SMTP service. To allow access, open up IIS MMC in the Administrator tools option. Seek the SMTP virtual server, and right-click, then select the properties. On the Access tab, click the Relay Restriction button. In the Relay Restrictions dialog, grant your IP address (127.0.0.1) to the computer ListBox. Close all the dialogs, and restart the SMTP service again.

Solution3

If you are using "localhost" or "127.0.0.1" as the SmtpMail.SmtpServer, make sure that Anonymous access is allowed. To allow Access, open up IIS Admin MMC. Locate the SMTP virtual server, and right-click, then select the properties. On the Access tab, click the Authentication button. Then make sure "Anonymous Access" is the only checkbox checked. Close all the dialogs, and restart the SMTP service.

The transport failed to connect

Solution1

The above error is a network related error. Now, make sure the server System.Web.Mail is executing. Some times firewalls or proxy servers can cause problems. Try specifying the value by IP address. Poor DNS resolution can sometimes hinder name lookups. Check that the mail server is running at port 25. If you did not specify a SmtpMail.SmtpServer property, or if SmtpMail.SmtpServer points to "localhost" (or 127.0.0.1), make sure the SMTP service is running on port 25. Sometimes the problem arises due to relay issues.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here