分享
 
 
 

用c#創建用於asp.net的smtp郵件服務

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

創建用於asp.net的smtp郵件服務

Asp.net在System.Web.Mail命名空間中有一個發送email的內建類,這僅是cdosys的一個包裝。開發者可能希望使用一個替代的它smtp郵件服務。在這篇文章裡面,我將會展示如何創建一個用於asp.net的功能齊全的smtp郵件服務。(僅僅是70行的c#語句)

首選,我們創建一個繼承命名空間System.Net.Sockets的TcpClient類的類。TcpClient類提供簡單的方法用於連接,發送,接收網絡的數據流。GetStream方法用於創建一個網絡流(NetworkStream)。讀和寫網絡流(NetworkStream)的方法用於發送數據給遠程主機和從遠程主機接收網絡流。

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 string MailServer = "127.0.0.1" ;

public string From = "" ;

public string To = "" ;

public string Body = "" ;

public string Subject = "" ;

和一個發送郵件的方法。這個方法將會用服務器名和它的端口去創建一個連接。指令可以被發送到遠程主機。

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);

}

現在,這個類基本完成了。開發者還可以建立錯誤回執和釋放資源(用TcpClient類中的Close()方法)。同樣,這幾個屬性可以被擴展到在郵件中包含更多的信息。

最後,我們可以在aspx文件中寫一些發送郵件的代碼。在這個例子中,“localhost”是郵件服務器。你可以根據情況改變這個,或者可以看我的關於如何設置你的發送郵件的本地服務器的文章。

<%@ 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);

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有