傳送驗證郵件的三種方法

2021-09-20 20:14:55 字數 3129 閱讀 8873

在.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...