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:
- Go to>Start Menu>Control Panel>Administrator Tools>Internet Information Services.
- Click the Internet Information Services and locate the Default SMTP Virtual Server.
- 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.
- 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();
Email.To=txtTo.Text;
Email.From=txtFrom.Text;
Email.Cc=txtCC.Text;
Email.Bcc=txtBCC.Text;
Email.Subject=txtSubject.Text;
Email.Body=txtMessage.Text;
Email.Priority=MailPriority.High;
Email.BodyFormat=MailFormat.Text;
if(rbtnAttach.Checked)
{
Email.Attachments.Add(
new MailAttachment(FileBrowse.Value));
}
SmtpMail.SmtpServer.Insert(0,"127.0.0.1");
SmtpMail.Send(Email);
Reset();
lblMessage.ForeColor=Color.Navy;
lblMessage.Text=
"*Your email has been sent successfully-Thank You";
}
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()
{
Control myForm=Page.FindControl("Form1");
foreach(Control ctl in myForm.Controls)
{
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
{
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)
{
InitializeComponent();
base.OnInit(e);
}
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
private void SendMail()
{
try
{
MailMessage Email=new MailMessage();
Email.To=txtTo.Text;
Email.From=txtFrom.Text;
Email.Cc=txtCC.Text;
Email.Bcc=txtBCC.Text;
Email.Subject=txtSubject.Text;
Email.Body=txtMessage.Text;
Email.Priority=MailPriority.High;
Email.BodyFormat=MailFormat.Text;
if(rbtnAttach.Checked)
{
Email.Attachments.Add(
new MailAttachment(FileBrowse.Value));
}
SmtpMail.SmtpServer.Insert(0,"127.0.0.1");
SmtpMail.Send(Email);
Reset();
lblMessage.ForeColor=Color.Navy;
lblMessage.Text=
"*Your email has been sent successfully-Thank You";
}
catch(Exception exc)
{
Reset();
lblMessage.Text="Send error:"+exc.ToString();
lblMessage.ForeColor=Color.Red;
}
}
private void Reset()
{
Control myForm=Page.FindControl("Form1");
foreach(Control ctl in myForm.Controls)
{
if(ctl.GetType().ToString().Equals(
"System.Web.UI.WebControls.TextBox"))
((TextBox)ctl).Text="";
}
}
private void btnSend_Click(object sender, System.EventArgs e)
{
SendMail();
}
private void btnCancel_Click(object sender, System.EventArgs e)
{
Reset();
}
private void rbtnAttach_CheckedChanged(object sender,
System.EventArgs e)
{
FileBrowse.Disabled=false;
}
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.