--原文出处http://www.charon.co.uk/content.aspx?CategoryID=28&ArticleID=59
在ASP.NET的名字空间System.Web.Mail中有一个内建的类来发送e-mail.但他仅仅是CDOSYS的一个包装而已。开发人员可能需要使用一个SMTP邮件服务器。在这篇文章中,我将揭示怎样用仅仅70行左右的C#代码来创建一个多功能的SMTP邮件服务器。
首先,我们创建一个类ClientConnection,它继承自名字空间System.Net.Sockets中的TcpClient类。TcpClient类提供了以同步方式连接、发送、接受数据流的简单方法。其中,GetStream方法用于创建一个数据流。Read和Write方法用户从远程主机读取和向远程主机发送消息。
public class ClientConnection : TcpClient
 {
  private NetworkStream _NetworkStream = null;
  private StreamReader _StreamReader = null;
  private StreamWriter _StreamWriter = null;
  public void Initialise()
  {
   _NetworkStream = this.GetStream();
   _StreamReader = new StreamReader(_NetworkStream, 
    System.Text.Encoding.Default, false, this.ReceiveBufferSize);
   _StreamWriter = new StreamWriter(_NetworkStream, 
    System.Text.Encoding.Default, this.SendBufferSize);
  }
  public void Send(string s)
  {
   _StreamWriter.WriteLine(s);
   _StreamWriter.Flush();
  }
  public string Read()
  {
   return _StreamReader.ReadLine();
  }
 }
接着,我们创建一个外部类Mail,它有一些公共属性用于设置邮件发送的信息。
public string MailServer = "127.0.0.1" ;
  public string From = "" ;
  public string To = "" ;
  public string Body = "" ;
  public string Subject = "" ;还有一个用户发送邮件的方法。这个方法用远程主机的ip地址和端口创建一个socket连接。
public void Send()
  {
   tcp = new ClientConnection();
   tcp.Connect(MailServer,25);
   tcp.Initialise();
   SendCommandToServer("HELO " + System.Net.Dns.GetHostName());
   SendCommandToServer("MAIL FROM: " + From + "\r\n");
   SendCommandToServer("RCPT TO: " + To + "\r\n");
   string StrHeaders = "";
   StrHeaders += "From: " + From + "\r\n";
   StrHeaders += "To: " + To + "\r\n";
   StrHeaders += "Subject: " + Subject + "\r\n";
   StrHeaders += "Content-type: text/plain; charset=\"ISO-8859-1\"" + "\r\n";
   SendCommandToServer("DATA\r\n" + StrHeaders);
   SendCommandToServer(Body + "\r\n.\r\n");
   SendCommandToServer("QUIT\r\n");
  }
以及一个私有方法用于给服务器发送一个命令。
private void SendCommandToServer(string cmd)
  {
   tcp.Send(cmd);
   Response=tcp.Read();
   System.Web.HttpContext.Current.Trace.Warn("Response",Response);
  }
现在,我们已经有了一个可用的smtp邮件服务器。
最后,我们在aspx.cs文件中发送邮件。在这里例子中,我们用”localhost”作为服务器地址。你可以查看
http://www.charon.co.uk/content.aspx?categoryid=27&articleid=26
了解怎样配置你的机器使其可以发送邮件。
<%@ Import Namespace="MyComponents" %>
<script runat="server">
protected void Page_Load(Object Src, EventArgs E)
{
  if (IsPostBack)
  {
   Mail Mailer=new Mail();
 Mailer.From=From.Text;
 Mailer.To=To.Text;
 Mailer.Subject=Subject.Text;
 Mailer.Body=Body.Text;
 Mailer.MailServer="localhost";
 Mailer.Send();
  }
}
</script>
完整的类如下所示:
using System.IO;
using System.Net.Sockets;
namespace MyComponents
{
 public class ClientConnection : TcpClient
 {
  private NetworkStream _NetworkStream = null;
  private StreamReader _StreamReader = null;
  private StreamWriter _StreamWriter = null;
  public void Initialise()
  {
   _NetworkStream = this.GetStream();
   _StreamReader = new StreamReader(_NetworkStream, 
    System.Text.Encoding.Default, false, this.ReceiveBufferSize);
   _StreamWriter = new StreamWriter(_NetworkStream, 
    System.Text.Encoding.Default, this.SendBufferSize);
  }
  public void Send(string s)
  {
   _StreamWriter.WriteLine(s);
   _StreamWriter.Flush();
  }
  public string Read()
  {
   return _StreamReader.ReadLine();
  }
 }
 public class Mail
 {
  public string MailServer = "127.0.0.1" ;
  public string From = "" ;
  public string To = "" ;
  public string Body = "" ;
  public string Subject = "" ;
  private ClientConnection tcp=null;
  private string Response="";
  public void Send()
  {
   tcp = new ClientConnection();
   tcp.Connect(MailServer,25);
   tcp.Initialise();
   SendCommandToServer("HELO " + System.Net.Dns.GetHostName());
   SendCommandToServer("MAIL FROM: " + From + "\r\n");
   SendCommandToServer("RCPT TO: " + To + "\r\n");
   string StrHeaders = "";
   StrHeaders += "From: " + From + "\r\n";
   StrHeaders += "To: " + To + "\r\n";
   StrHeaders += "Subject: " + Subject + "\r\n";
   StrHeaders += "Content-type: text/plain; charset=\"ISO-8859-1\"" + "\r\n";
   SendCommandToServer("DATA\r\n" + StrHeaders);
   SendCommandToServer(Body + "\r\n.\r\n");
   SendCommandToServer("QUIT\r\n");
  }
  private void SendCommandToServer(string cmd)
  {
   tcp.Send(cmd);
   Response=tcp.Read();
   System.Web.HttpContext.Current.Trace.Warn("Response",Response);
  }
 }