首先,我們簡單介紹一下帶驗證的**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,即簡單郵件傳輸協議,對...