Introduction
This application demonstrates how to send mail with attachments using SMTP server and how to configure the default SMTP server. The System.Web.Mail
namespace provides classes for sending email in .NET. The classes involved are MailMessage
which manages the content of the mail message and MailAttachment
which manages the mail attachments.
Setting SMTP server
Before running the application you need to confirm these server settings:
- Make sure that the SMTP server is running, only then it can relay mail. If not, open the IIS window, in IIS look for the "local computer" on the left side tree view under which you will see the "Default SMTP Virtual Server", if it is not available, then you need to install it.
- To configure "Default SMTP Virtual Server", right-click on it, go into "Properties", and select "Access" tab, and then click the "Relay" button. With "only the list below" radio button selected, you should see the local IP address: "127.0.0.1", if it's not there, you need to add it.
- If you are using "localhost" or "127.0.0.1" as the
SmtpMail.SmtpServer
, make sure "Anonymous access is allowed". To allow access, open up the IIS. Locate the SMTP virtual server, and right-click select Properties. On the Access tab, click the Authentication button. Make sure "Anonymous Access" is the only checkbox checked.
- Use real from and to addresses that exist on the
SmtpMail.SmtpServer
. Do not use invalid address.
Getting objects
Initially, we need to create a new object for the MailMessage
class, we will call it "mailMessage
". Then we set the From
, To
, Cc
, Bcc
, Subject
and Body
properties as well as the BodyFormat
of this object to the values on our web form:
MailMessage mailMessage = new MailMessage ();
mailMessage.From = txtSender.Text;
mailMessage.To = txtReceiver.Text;
mailMessage.Cc = txtCc.Text;
mailMessage.Bcc = txtBcc.Text;
mailMessage.Subject = txtSubject.Text;
mailMessage.Body = txtBody.Text;
if (rblMailFormat.SelectedItem.Text == "Text")
mailMessage.BodyFormat = MailFormat.Text;
else
mailMessage.BodyFormat = MailFormat.Html;
Making attachments
To make attachments we need to use the MailAttachment
class and for this we create an object attach
. The following block of code checks the Open File Dialogs of our web form (the Open File Dialog is an HTML file field control to which we've added the runat="server"
property). If there is a value, the file is uploaded, saved on the server and added as an attachment to the email.
if (inpAttachment1.PostedFile != null)
{
HttpPostedFile attFile = inpAttachment1.PostedFile;
int attachFileLength = attFile.ContentLength;
if (attachFileLength > 0)
{
strFileName = Path.GetFileName(inpAttachment1.PostedFile.FileName);
inpAttachment1.PostedFile.SaveAs(Server.MapPath(strFileName));
MailAttachment attach = new MailAttachment(Server.MapPath(strFileName));
mailMessage.Attachments.Add(attach);
attach1 = strFileName;
}
}
Now, we send the email with the attachments:
SmtpMail.SmtpServer = "127.0.0.1";
(Or)
SmtpMail.SmtpServer.Insert(0,"127.0.0.1");
SmtpMail.Send (mailMessage);
Finally, if the attachments are available then we need to delete it:
if (attach1 != null)
File.Delete(Server.MapPath(attach1));
if (attach2 != null)
File.Delete(Server.MapPath(attach2));
if (attach3 != null)
File.Delete(Server.MapPath(attach3));
Various ways to set the SMTP Mail server:
SmtpMail.SmtpServer = "localhost"
or
SmtpMail.SmtpServer = "127.0.0.1"
or
SmtpMail.SmtpServer.Insert( 0,
"127.0.0.1 or your mail server name here")
You need to replace "localhost" with the name or IP address of your SMTP Mail server on a Windows desktop computer or you can insert the server but "localhost" is the default value and it usually works.