創(chuàng)建基于ASP.NET的SMTP郵件服務
2024-07-10 12:59:33
供稿:網(wǎng)友
中國最大的web開發(fā)資源網(wǎng)站及技術(shù)社區(qū),
asp.net在system.web.mail名稱空間中有一個發(fā)送email的內(nèi)建類,但這僅是cdosys的一個假象。開發(fā)者能使用一個替代的它smtp郵件服務。在這篇文章里面,我將會展示如何創(chuàng)建一個用于asp.net的功能齊全的smtp郵件服務。
首先,我們創(chuàng)建一個繼承命名空間system.net.sockets的tcpclient類的類。tcpclient類提供簡單的方法用于連接,發(fā)送,接收網(wǎng)絡的數(shù)據(jù)流。getstream方法用于創(chuàng)建一個網(wǎng)絡流(networkstream)。讀和寫網(wǎng)絡流(networkstream)的方法用于發(fā)送數(shù)據(jù)給遠程主機和從遠程主機接收網(wǎng)絡流。
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();
}
}
接下來,我們創(chuàng)建發(fā)送郵件出去的類,這個類有幾個屬性去設置關(guān)于被發(fā)送的郵件的一些信息。
public string mailserver = "127.0.0.1" ;
public string from = "" ;
public string to = "" ;
public string body = "" ;
public string subject = "" ;
和一個發(fā)送郵件的方法。這個方法將會用服務器名和它的端口去創(chuàng)建一個連接。指令可以被發(fā)送到遠程主機。
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);
}
現(xiàn)在,這個類基本完成了。開發(fā)者還可以建立錯誤回執(zhí)和釋放資源(用tcpclient類中的close()方法)。同樣,這幾個屬性可以被擴展到在郵件中包含更多的信息。
最后,我們可以在aspx文件中寫一些發(fā)送郵件的代碼。在這個例子中,"localhost"是郵件服務器。你可以根據(jù)情況改變這個,或者可以看我的關(guān)于如何設置你的發(fā)送郵件的本地服務器的文章。
<%@ 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);
}
}
}