我们知道,在ASP.Net中发送Email 是一件很简单的事情,豆腐在这里要给大家将一种相对来说比较复杂的一种发送Email的方式,用Socket 来发送Email。
我们首先来熟悉熟悉SMTP 协议我们来看看SMTP 在 TELNET 下我们应该如何命令:
telnet pop.21cn.com 25
回应:220 21cn.com SMTP Server of AIMC 2.5.3.0; Sat Feb 10 11:34:18 2001
命令:helo www.ASP888.ne
回应:250 21cn.com, www.ASP888.net<61.134.6.89> okay.
命令:mail from:XXXX@21cn.com file://XXX 是你在21cn 的user
回应:250 <XXXX@21cn.com>, sender ok.
命令:rcpt to:XXX@domain.com file://XXX@domain.com 是收信人的mail地址
回应:250 User not local, will forward to <XXX@domain.com>.
命令:data
回应:354 Start mail input; end with <CRLF>.<CRLF>
From:<XXXX@21cn.com>
To:<XXX@doamin.com>
Subject:test
this is a test
回应:250 Requested mail action okay, completed.
好了,这个过程就是一个完整的SMTP的过程,下面我们就来看看 豆腐 用 C# 做的这个发送Mail的工具
<%@ Assembly Name="System.Net" %>
<%@ Import Namespace="System.Net" %>
<% @Import Namespace="System.Net.Sockets" %>
<%@ Import Namespace="System.IO" %>
<script language="C#" runat=server>
protected void SendMailClick(Object Src, EventArgs E){
String smtpserver=txtSmtpserver.Text; file://smtp服务器的IP地址
TCPClient tcpc = new TCPClient();
if (0 == tcpc.Connect(smtpserver, txtPort.Text.ToInt16()))
{
file://连接smtp 服务器成功
Stream s;
StreamReader sr ;
String strCmd;
Byte[] arrCmd;
String strRet;
String[] arrRet;
sr = new StreamReader(tcpc.GetStream(), Encoding.Default);
strRet=sr.ReadLine() + "<br>"; file://mail server 的欢迎语
file://服务器连接成功以后,首先向服务器发送HeLo命令
strCmd="HELO www.ASP888.net";
strRet=strRet + SenSmtpCmd(tcpc,strCmd) + "<br>";
file://然后向服务器发送信件的成员的信箱
strCmd="mail from:"+ sender.Text;
strRet=strRet + SenSmtpCmd(tcpc,strCmd) + "<br>";
file://向服务器发送收件人的信箱
strCmd="rcpt to:" + receive.Text;
strRet=strRet + SenSmtpCmd(tcpc,strCmd) + "<br>";
file://所有的准备工作都已经作好了,下面开始进行邮件的部分
strCmd="data";
strRet=strRet + SenSmtpCmd(tcpc,strCmd) + "<br>";
file://邮件内容
strCmd="Date: 1234567\r\n";
strCmd=strCmd+"From:" + sender.Text +"\r\n";
strCmd=strCmd+"To:" + receive.Text +"\r\n";
strCmd=strCmd+"Subject:" + subject.Text +"\r\n\r\n";
strCmd=strCmd + content.Text +"\r\n\r\n";
strRet=strRet + SenSmtpCmd1(tcpc,strCmd) + "<br>";
strCmd="\r\n.\r\n";
strRet=strRet + SenSmtpCmd(tcpc,strCmd) + "<br>";
/*strCmd=strCmd+"From:xuexh@haitai.com.cm\r\n";
strCmd=strCmd+"To:xuexh@haitai.com.cn\r\n";
strCmd=strCmd+"subject:这是一个测试的邮件\r\n";
strCmd=strCmd+"\r\n";
strCmd=strCmd+"这些是测试邮件的邮件内容\r\n";
strCmd=strCmd+"\r\n.\r\n";
*///strRet=strRet + SenSmtpCmd(tcpc,strCmd) + "<br>";
file://最后 关闭与smtp 服务器的连接
tcpc.Close();
showmsg.Text=strRet;
}
else
{
showmsg.Text="对不起,连接服务器失败";
}
}
String SenSmtpCmd(TCPClient tcpc,String strCmd){
file://为了程序的简单可读,特意写了这个函数
Byte[] arrCmd;
String strRet;
StreamReader sr;
Stream s;
s=tcpc.GetStream();
strCmd = strCmd + "\r\n";
arrCmd= Encoding.Default.GetBytes(strCmd.ToCharArray());
s=tcpc.GetStream();
s.Write(arrCmd, 0, strCmd.Length);
sr = new StreamReader(tcpc.GetStream(), Encoding.Default);
strRet=sr.ReadLine();
return strRet;