使用Socket撰寫郵件傳送程式

2021-03-31 17:29:16 字數 2560 閱讀 8752

首先,我們簡單介紹一下帶驗證的**tp伺服器如何使用auth原語進行身份驗證,其詳細的定義可以參考rfc2554。

具體如下:

1)首先,需要使用ehlo而不是原先的helo。

2)ehlo成功以後,客戶端需要傳送auth原語,與伺服器就認證時使用者名稱和密碼的傳遞方式進行協商。

3)如果協商成功,伺服器會返回以3開頭的結果碼,這是就可以把使用者名稱和密碼傳給伺服器。

4)最後,如果驗證成功,就可以開始發信了。

下面是乙個實際的例子,客戶端在winxp的***mand視窗中通過"tel*** **tp.263.*** 25"命令連線到263的**tp伺服器發信:

220 wel***e to coremail system(with anti-spam) 2.1

ehlo 263.***

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:myaccount@263.***

250 ok

rcpt to:myaccount@263.***

250 ok

data

354 end data with .

this is a testing email.

haha.

.250 ok: queued as ac5291d6406c4

quit

221 bye

writetostream(ref nwstream, "ehlo " + **tphost + "/r/n");

string wel***emsg = readfromstream(ref nwstream);

// implement helo ***mand if ehlo is unrecognized.

if (isunknown***mand(wel***emsg))

checkforerror(wel***emsg, replyconstants.ok);    

// authentication is used if the u/p are supplied

authlogin(ref nwstream);

writetostream(ref nwstream, "mail from: <" + msg.from.address + ">/r/n");

checkforerror(readfromstream(ref nwstream), replyconstants.ok);

sendrecipientlist(ref nwstream, msg.to);

sendrecipientlist(ref nwstream, msg.cc);

sendrecipientlist(ref nwstream, msg.bcc);

writetostream(ref nwstream, "data/r/n");

checkforerror(readfromstream(ref nwstream), 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

writetostream(ref nwstream, "to: " + createaddresslist(msg.to) + "/r/n");

if (msg.cc.count != 0)

writetostream(ref nwstream, "subject: " + msg.subject + "/r/n");

if (msg.priority != null)

if (msg.headers.count > 0)

if (msg.attachments.count > 0 || msg.htmlbody != null)

else

writetostream(ref nwstream, "/r/n./r/n");

checkforerror(readfromstream(ref nwstream), replyconstants.ok);

writetostream(ref nwstream, "quit/r/n");

checkforerror(readfromstream(ref nwstream), replyconstants.quit);

closeconnection();

}private bool authlogin(ref ***workstream nwstream)

}return false;

}

使用Socket傳送郵件

之前寫過一篇 使用php傳送郵件 方法是利用nette mail元件傳送郵件。以下內容整理自 php核心技術與最佳實踐 php有乙個自帶的mail 函式,但是要想使用smtp協議傳送郵件,需要安裝smtp伺服器。如果不想安裝,可以使用socket傳送郵件。smtp協議建立在tcp協議之上,所以原則上...

PHP使用socket傳送郵件

smtp協議建立在tcp協議之上,所以原則上按照smtp協議的規範,使用socket跟smtp伺服器進行互動。使用fsockopen 函式代替socket 類函式。fsockopen 函式的好處是把socket連線繫結到乙個流上,然後使用各種操作流的函式操作這個socket連線。使用fsockope...

用socket來傳送郵件

以前用vb時,記得有個mail控制項,後來接觸到了cdo.messages這個玩意,發郵件是蠻方便,那還是在vbs的情況下,後來看了下php,perl,發現發郵件乙個函式就可以了,呵呵,那麼這些背後的細節是什麼呢,還是用socket來揭示下吧 郵件傳送離不開一樣東西,smtp,即簡單郵件傳輸協議,對...