使用 ASP.NET 的电子邮件系统






4.46/5 (26投票s)
本文探讨了 SMTP 的概念、配置以及简单的邮件服务。

引言
本文探讨了一个以简单方式开发的电子邮件系统的特性,并展示了如何轻松地创建一个简单的邮件服务。我相信,阅读本文的任何人都会对电子邮件服务以及基于 SMTP 的邮件服务器背后的概念有一个相当好的了解。
问题所在
您多久会遇到因缺乏技术知识和框架核心概念而导致的问题?本文以最简单的方式探讨了邮件服务器背后的概念。本文
- 探讨了使用 SMTP 配置邮件服务器的设置。
- 以非常有趣且简单的方式描述了代码。
- 描述了为在 Web 服务器上托管它需要进行的设置。
- 描述了运行时发生问题的解决方案。
探索技术
SMTP 代表简单邮件传输协议。电子邮件使用此完美协议发送。 .NET Framework 提供了 SMTP 类,可让您发送简单的电子邮件。如果您需要发送具有附加功能的电子邮件,则必须使用 MailMessage 类。借助此类,您可以轻松地插入附件、设置优先级等。您还可以使用此类发送 HTML 电子邮件。
邮件服务器的先决条件
首先,您需要检查 IIS(Internet Information Service,是随操作系统一起提供的 Windows 组件)中的 SMTP 服务是否已启用。您可以在控制面板的“添加/删除程序”部分中找到此服务。

在“添加/删除程序”部分中,单击“Windows 组件”,您将看到如下所示的屏幕。

查看 IIS 是否已选中,如果已选中(已安装),请单击 IIS(Internet Information Services),您将看到如下所示的屏幕。

然后,检查 SMTP 服务是否已安装。如果服务不可用,您需要选择 SMTP 服务并按照向导进行操作。有时它可能会要求提供 Windows XP CD 来安装 Windows 组件。现在,该应用程序就可以使用 SMTP 邮件服务了。
配置和设置
要配置 SMTP 服务器,您需要按照以下步骤操作:
- 转到 >“开始”菜单 >“控制面板” >“管理工具” >“Internet Information Services”。
- 单击“Internet Information Services”并找到“默认 SMTP 虚拟服务器”。
- 右键单击它,然后转到属性,如下所示。 根据图示进行设置,选择您自己的 IP 地址。 
- 然后转到选项卡菜单中的“访问”选项,然后单击“中继限制”。在“中继”中,您将看到如下所示的屏幕,现在请相应配置。 在“访问”选项卡中,您还需要根据下图配置连接属性,并将其余设置保留原样。  IP 地址 127.0.0.1 代表本地主机。现在,您可以准备好应用程序了。 
代码片段
项目代码片段将在下面解释。
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;
   }
}
在按钮的 Click 事件中调用 SendMail() 方法,如下所示。
private void btnSend_Click(object sender, System.EventArgs e)
{
  SendMail();
}
Reset() 方法中的代码块如下所示。
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="";
   }
}
在另一个按钮的 Click 事件中调用 Reset() 方法,如下所示。
private void btnCancel_Click(object sender, System.EventArgs e)
{
    Reset();
}
最终解决方案
我们的代码现在如下所示:
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;
        }
        //*************************************************************
    }
}
使用解决方案
下载上面提供的 zip 格式的源代码文件,并将内容复制到根目录(例如,C:\Inetpub\wwwroot)。转到“Internet Information Services”,创建一个名为 EmailSystem 的虚拟目录,并为其分配正确的映射路径。
某些问题的解决方案
错误:“无法访问 'CDO.Message' 对象”
解决方案 1
为 SmtpMail.SmtpServer 属性指定一个有效的邮件服务器。如果该属性未设置,请将其设置为 127.0.0.1 或 localhost。例如:SmtpMail.SmtpServer = "127.0.0.1"。
解决方案 2
如果您使用“localhost”或“127.0.0.1”作为 SmtpMail.SmtpServer,您可能没有权限通过 IIS SMTP 服务进行中继。要允许访问,请在“管理工具”选项中打开 IIS MMC。找到 SMTP 虚拟服务器,右键单击,然后选择“属性”。在“访问”选项卡上,单击“中继限制”按钮。在“中继限制”对话框中,将您的 IP 地址 (127.0.0.1) 添加到“计算机”列表框中。关闭所有对话框,然后重新启动 SMTP 服务。
解决方案 3
如果您使用“localhost”或“127.0.0.1”作为 SmtpMail.SmtpServer,请确保启用了匿名访问。要允许访问,请打开 IIS 管理 MMC。找到 SMTP 虚拟服务器,右键单击,然后选择“属性”。在“访问”选项卡上,单击“身份验证”按钮。然后,确保仅选中“匿名访问”复选框。关闭所有对话框,然后重新启动 SMTP 服务。
传输连接失败
解决方案 1
上述错误是网络相关错误。现在,请确保 System.Web.Mail 服务器正在执行。有时防火墙或代理服务器可能会导致问题。尝试通过 IP 地址指定值。糟糕的 DNS 解析有时会妨碍名称查找。检查邮件服务器是否正在端口 25 上运行。如果您未指定 SmtpMail.SmtpServer 属性,或者 SmtpMail.SmtpServer 指向“localhost”(或 127.0.0.1),请确保 SMTP 服务正在端口 25 上运行。有时问题是由于中继问题引起的。


