top
Loading...
用ASP.Net發送MailList(一)

我們知道,在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";

strCmd=strCmd+"From:" + sender.Text +"";

strCmd=strCmd+"To:" + receive.Text +"";

strCmd=strCmd+"Subject:" + subject.Text +"";

strCmd=strCmd + content.Text +"";

strRet=strRet + SenSmtpCmd1(tcpc,strCmd) + "<br>";

strCmd=".";

strRet=strRet + SenSmtpCmd(tcpc,strCmd) + "<br>";

/*strCmd=strCmd+"From:xuexh@haitai.com.cm";

strCmd=strCmd+"To:xuexh@haitai.com.cn";

strCmd=strCmd+"subject:這是一個測試的郵件";

strCmd=strCmd+"";

strCmd=strCmd+"這些是測試郵件的郵件內容";

strCmd=strCmd+".";

*///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 + "";

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;

}

String SenSmtpCmd1(TCPClient tcpc,String strCmd){

file://為了程序的簡單可讀,特意寫了這個函數

Byte[] arrCmd;

String strRet;

StreamReader sr;

Stream s;

s=tcpc.GetStream();

strCmd = strCmd;

arrCmd= Encoding.Default.GetBytes(strCmd.ToCharArray());

s=tcpc.GetStream();

s.Write(arrCmd, 0, strCmd.Length);

return "";

}

</script>

<form id=testForm runat=server>

<asp:label id=showmsg runat=server /><br>

SMTP服務器:<asp:TextBox id=txtSmtpserver runat=server /><asp:TextBox id=txtPort Text=25 runat=server /><br>

發信人:<asp:TextBox id=sender runat=server />

<br>

收信人:<asp:TextBox id=receive runat=server />

<br>

信件主題:<asp:TextBox id=subject runat=server />

<br>

信件內容:<asp:TextBox id=content runat=server TextMode=MultiLine rows=10/>

<asp:Button Text="發送" id=SendMail onClick=SendMailClick runat=server />

</form>

大家可能在看這段程序的時候已經發現了這樣的兩個函數SenSmtpCmd和SenSmtpCmd1,這兩個函數的作用是SenSmtpCmd1不接收smtp server 傳遞回來的回應,主要是目前的這個版本的asp.net 在處理中文的時候還是存在一定的Bug,所以就只有采取這樣的變通的辦法了。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗