在.net中的system.web.mail名字空間下,有乙個專門使用smtp協議來傳送郵件的類:smtpmail,它已能滿足最普通的傳送郵件的需求。這個類只有乙個自己的公共函式--send()和乙個公共屬性—smtpserver
您必須通過smtpserver屬性來指定傳送郵件的伺服器的名稱(或ip位址),然後再呼叫
send()函式來傳送郵件。 第
二、使用cdo元件傳送郵件
cdo是collaboration data objects的簡稱,它是一組高層的com物件集合,並經歷了好幾個版本的演化,現在在windows2000和exchange2000中使用的都是cdo2.0的版本(分別為cdosys.dll和cdoex.dll)。cdosys構建在smtp協議和nntp協議之上,並且作為windows2000 server的元件被安裝,您可以在系統目錄(如c:\winnt或c:\windows)的system32子目錄中找到它(cdosys.dll)。
cdo元件相對於先前介紹的smtpmail物件功能更為豐富,並提供了一些smtpmail類所沒有提供的功能,如通過需要認證的smtp伺服器傳送郵件等。
下面一段**就展示了如何使用cdo元件通過需要認證的smtp伺服器傳送郵件的過程:
(in c#)
public void cdosendmail()
catch (exception e)
}注意:由於exchange2000的cdo元件cdoex.dll會更新原有的windows2000的cdo元件cdosys.dll,所以如果您希望繼續使用cdosys.dll,您必須先通過regsrv32.exe解除安裝掉cdoex.dll。
第三、使用socket撰寫郵件傳送程式
當然,如果您覺得smtpmail不能滿足您的需求,cdo又不夠直截了當,那就只能自己動手了;其實如果您很熟悉socket程式設計,自己寫乙個傳送郵件的程式並不很難,以下就是乙個例子。
首先,我們簡單介紹一下帶驗證的smtp伺服器如何使用auth原語進行身份驗證,其詳細的定義可以參考rfc2554。
具體如下:
1)首先,需要使用ehlo而不是原先的helo。
2)ehlo成功以後,客戶端需要傳送auth原語,與伺服器就認證時使用者名稱和密碼的傳遞方式進行協商。
3)如果協商成功,伺服器會返回以3開頭的結果碼,這是就可以把使用者名稱和密碼傳給伺服器。
4)最後,如果驗證成功,就可以開始發信了。
下面是乙個實際的例子,客戶端在winxp的command視窗中通過"telnet smtp.263.net 25"命令連線到263的smtp伺服器發信:
220 welcome to coremail system(with anti-spam) 2.1
ehlo 263.net
250-192.168.30.29
250-pipelining
250-size 10240000
250-etrn
250-auth login
250 8bitmime
auth login
334 vxnlcm5hbwu6
bxlhy2nvdw50
334 ugfzc3dvcmq6
bxlwyxnzd29yza==
235 authentication successful
mail from:[email protected]
250 ok
rcpt to:[email protected]
250 ok
data
354 end data with .
this is a testing email.
haha.
.250 ok: queued as ac5291d6406c4
quit
221 bye
上面的內容就是發信的全過程。其中與身份驗證有關的主要是第九到第十四行:
auth login "客戶端輸入
334 vxnlcm5hbwu6 "伺服器提示「username:="
bxlhy2nvdw50 "客戶端輸入「myaccount="的base64編碼
334 ugfzc3dvcmq6 "伺服器提示「password:="
bxlwyxnzd29yza== "客戶端輸入「mypassword="的base64編碼
235 authentication successful "伺服器端通過驗證
從上面的分析可以看出,在這個身份驗證過程中,伺服器和客戶端都直接通過socket傳遞經過標準base64編碼的純文字。這個過程可以非常方便的用c#實現,或者直接新增到原有的源**中。
另外,有些esmtp伺服器不支援auth login方式的認證,只支援auth cram-md5方式驗證。但是這兩者之間的區別只是文字的編碼方式不同。
public void sendmail(mailmessage msg)
checkforerror(welcomemsg,replyconstants.ok);
// authentication isused if the u/p are supplied
authlogin(refnwstream);
writetostream(refnwstream, "mail from: <" + msg.from.address +">\r\n");
checkforerror(readfromstream(refnwstream), replyconstants.ok);
sendrecipientlist(refnwstream, msg.to);
sendrecipientlist(refnwstream, msg.cc);
sendrecipientlist(refnwstream, msg.bcc);
writetostream(refnwstream, "data\r\n");
checkforerror(readfromstream(refnwstream), replyconstants.start_input);
if (msg.replyto.name!= null && msg.replyto.name.length != 0)
else
if (msg.from.name !=null && msg.from.name.length != 0)
else
writetostre
C 實現傳送郵件的三種方法
這篇文章主要介紹了c 實現傳送郵件的三種方法,例項講述了localhost,smtp與ssl smtp三種實現方法,對於c 專案開發有不錯的借鑑價值,需要的朋友可以參考下 2.通過普通smtp c 如下 複製 如下 public void sendmailusezj catch system.net...
C 實現傳送郵件的三種方法
這篇文章主要介紹了c 實現傳送郵件的三種方法,例項講述了localhost,smtp與ssl smtp三種實現方法,對於c 專案開發有不錯的借鑑價值,需要的朋友可以參考下 2.通過普通smtp c 如下 複製 如下 public void sendmailusezj catch system.net...
C 實現傳送郵件的三種方法
這篇文章主要介紹了c 實現傳送郵件的三種方法,例項講述了localhost,smtp與ssl smtp三種實現方法,對於c 專案開發有不錯的借鑑價值,需要的朋友可以參考下 smtpclient client new smtpclient client.host localhost object us...