使用NET Framework下的SystemNetMailSmtpClient可以很容易的實現郵件發送但現在很多郵件服務器已經支持ESMTP協議而ESMTP最大的區別在於發送時需要提供帳號密碼做驗證ESMTP通過流的方式發送命令與服務器交互完成郵件的發送與接受更多關於SMTP的命令請參考<>
下面是一個簡單的示例(沒有做任何判斷與封裝僅供參考)
代碼
string smtp = ;
string from = ;
string pwd = pwd;
string to = ;
//建立鏈接
TcpClient tc = new TcpClient(smtp);
byte[] b = new byte[];
tcGetStream()Read(bbLength);
ResponseWrite(EncodingUTFGetString(b)+<br/>);
//標識身份
WriteMsg(tcGetStream() HELO xxxx\r\n);
ResponseWrite(ReadMsg(tcGetStream()) + <br/>);
//身份驗證開始
WriteMsg(tcGetStream() AUTH LOGIN\r\n);
ResponseWrite(ReadMsg(tcGetStream()) + <br/>);
//帳號 base編碼
byte[] bTxt=new byte[];
bTxt=EncodingUTFGetBytes(from);
WriteMsg(tcGetStream() ConvertToBaseString(bTxt)+\r\n);
ResponseWrite(ReadMsg(tcGetStream()) + <br/>);
//密碼base編碼
bTxt=EncodingUTFGetBytes(pwd);
WriteMsg(tcGetStream() ConvertToBaseString(bTxt) + \r\n);
ResponseWrite(ReadMsg(tcGetStream()) + <br/>);
//身份驗證結束
//發送郵件地址
WriteMsg(tcGetStream() stringFormat(MAIL FROM:{}\r\n from));
ResponseWrite(ReadMsg(tcGetStream()) + <br/>);
//接受郵件地址可以有多個RCPT TO
WriteMsg(tcGetStream() stringFormat(RCPT TO:{}\r\n to));
ResponseWrite(ReadMsg(tcGetStream()) + <br/>);
//初如化
WriteMsg(tcGetStream() DATA \r\n);
ResponseWrite(ReadMsg(tcGetStream()) + <br/>);
//郵件內容
StringBuilder sb = new StringBuilder();
sbAppendFormat(From:{}\r\n from);//發信人
sbAppendFormat(To:{}\r\n to);//收信人可以有多個用分號隔開 這兩行可以與上面的MAIL FROM和RCPT TO不同(顯示在郵件內容裡的)
sbAppendFormat(Date:{}\r\nDateTimeNowToString());//時間
sbAppendFormat(Subject:{}\r\n 測試);//主題
sbAppend(\r\n);
sbAppend(內容); //正文
sbAppend(\r\n\r\n);
WriteMsg(tcGetStream() sbToString());
ResponseWrite(ReadMsg(tcGetStream()) + <br/>);
//結束會話
WriteMsg(tcGetStream() QUIT);
//關閉鏈接
tcClose();
如果運行正常上面的返回狀態依次為
ESMTP CMailServer SMTP Service Ready
welcome here
VXNlcmhbWU
UGFzcdvcmQ
OK
OK
OK
send the mail data end with
OK
From:http://tw.wingwit.com/Article/program/net/201311/13700.html