版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于BCB開發(fā)具有身份認(rèn)證功能的郵件發(fā)送程序
摘要本文介紹了如何增強(qiáng)BCB中發(fā)送電子郵件的NMSMTP控件的功能,實(shí)現(xiàn)具有身份認(rèn)證功能的郵件發(fā)送程序。關(guān)鍵詞ESMTP,MIME,身份認(rèn)證1引言為了更有效地抑制垃圾郵件的泛濫,目前多數(shù)網(wǎng)站的郵件收發(fā)系統(tǒng)都使用了ESMTP服務(wù)的身份認(rèn)證功能。即用戶發(fā)送郵件時(shí),需要對(duì)用戶的身份進(jìn)行驗(yàn)證,如果帳號(hào)或密碼錯(cuò)誤,郵件服務(wù)器會(huì)拒絕發(fā)送郵件。BorlandC++Builder6中有豐富的控件供開發(fā)者使用,其中當(dāng)然也包括郵件發(fā)送控件NMSMTP,這個(gè)控件使用方便,但是惟一的缺點(diǎn)是不支持郵件發(fā)送時(shí)的身份認(rèn)證功能。筆者通過對(duì)郵件發(fā)送協(xié)議的分析,在使用控件的基礎(chǔ)上設(shè)計(jì)了具有身份認(rèn)證功能的郵件發(fā)送程序。2ESMTP協(xié)議分析為了實(shí)現(xiàn)身份認(rèn)證功能,目前ESMTP協(xié)議中增加了一部分內(nèi)容,這就是身份認(rèn)證。下面我們看看這段認(rèn)證過程,以筆者在網(wǎng)易的郵箱為例(其中C表示客戶端,S表示郵件服務(wù)器):(1)C:AUTHLOGIN(2)S:334dXNlcm5hbWU6(3)C:d3lxX2puX3NkX2Nu(4)S:334UGFzc3dvcmQ6(5)C:密碼略去(6)S:235Authenticationsuccessful詳細(xì)說明:(1)客戶端向服務(wù)器發(fā)送認(rèn)證指令。(2)服務(wù)器返回Base64編碼串,334意味成功。編碼字符串解碼后為"username:",說明要求客戶端發(fā)送用戶名。(3)客戶端發(fā)送Base64編碼的用戶名串,此處為"wyq_jn_sd_cn"。(4)服務(wù)器返回Base64編碼串,334意味成功。編碼字符串解碼后為"password:",說明要求客戶端發(fā)送用戶口令。(5)客戶端發(fā)送Base64編碼的口令串,此處略去。(6)服務(wù)器返回普通字符串,235意味成功,表示認(rèn)證成功可以發(fā)送郵件了。3MIMEBase64編碼解釋一般的計(jì)算機(jī)編碼的一個(gè)字節(jié)是8bit,0——FF就是256種不同的8bit組合。我們現(xiàn)在要介紹的這種Base64編碼則是每個(gè)字節(jié)6bit,共有26=64種組合。其中每種組合對(duì)應(yīng)一個(gè)字符,這些字符是“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/?!边@就意味著每3個(gè)普通編碼可以轉(zhuǎn)換成4個(gè)Base64編碼,那么如果需要轉(zhuǎn)換的普通編碼不是3的整數(shù)倍怎么辦?Base64規(guī)定,位數(shù)不足的字節(jié)后面補(bǔ)0,然后差幾個(gè)字符補(bǔ)幾個(gè)‘=’號(hào)。4設(shè)計(jì)思路我們可以使用NMSMTP控件與郵件服務(wù)器連接。通過調(diào)用Connect方法,然后監(jiān)聽OnConnect事件;在OnConnect事件里我們可以增加身份認(rèn)證功能。這里是主要利用了NMSMTP從Powersock中繼承的一些基本網(wǎng)絡(luò)通訊函數(shù),包括Read,DataAvailable,SendBuffer等來實(shí)現(xiàn)身份認(rèn)證過程。如果身份認(rèn)證成功,就可以繼續(xù)進(jìn)行郵件發(fā)送;否則,提示錯(cuò)誤信息,斷開網(wǎng)絡(luò)連接。5程序?qū)崿F(xiàn)
使用BCB設(shè)計(jì)如圖1所示的窗體。圖1程序主界面5.1在登錄按鈕的onClick事件中調(diào)用連接函數(shù)void__fastcallTForm1::Logon1Click(TObject*Sender){
AddLog("正在登錄"+Edit1->Text+"");
NMSMTP1->Host=Edit1->Text;
//主機(jī)地址
NMSMTP1->Port=25;
//主機(jī)端口,缺省為25
NMSMTP1->UserID=Edit4->Text;
//用戶名
NMSMTP1->Connect();
//連接主機(jī)}5.2處理OnConnect事件void__fastcallTForm1::NMSMTP1Connect(TObject*Sender){AddLog("連接服務(wù)器成功。");AnsiStringData="",rData="";boolb_ok;if(CheckBox1->Checked){
Data="AUTHLOGIN\r\n";
//登錄請(qǐng)求命令
NMSMTP1->SendBuffer(Data.c_str(),Data.Length());//命令發(fā)出
rData=WaitForReply(5);
//等待接收返回?cái)?shù)據(jù),5秒內(nèi)必須返回
b_ok=false;
if(rData.Length()>=3){
//334意味著服務(wù)器要求輸入用戶名
if(rData.TrimLeft().SubString(0,3)=="334"){AddLog("正在驗(yàn)證身份");b_ok=true;
}
}
if(!b_ok){
AddLog("登錄失敗,正在退出");
NMSMTP1->Disconnect();
return;rData="";
Data=encode(Edit4->Text)+"\r\n";
//用戶名轉(zhuǎn)換為Base64編碼。
NMSMTP1->SendBuffer(Data.c_str(),Data.Length());//發(fā)送用戶名
rData=WaitForReply(5);
b_ok=false;
if(rData.Length()>=3){
//334意味著服務(wù)器要求輸入口令
if(rData.TrimLeft().SubString(0,3)=="334"){AddLog("正在驗(yàn)證口令");b_ok=true;
}
}
if(!b_ok){
AddLog("登錄失敗,正在退出");
NMSMTP1->Disconnect();
return;
}
rData="";
Data=encode(Edit5->Text)+"\r\n";//口令轉(zhuǎn)換成Base64編碼。
NMSMTP1->SendBuffer(Data.c_str(),Data.Length());//發(fā)送口令
rData=WaitForReply(5);
b_ok=false;
if(rData.Length()>=3){
if(rData.TrimLeft().SubString(0,3)=="235"){AddLog("登錄成功");b_ok=true;
}
}
if(!b_ok){
AddLog("登錄失敗,正在退出");
NMSMTP1->Disconnect();
return;
}}SendMail->Enabled=true;
//允許發(fā)送郵件disconnect->Enabled=true;
//允許斷開連接Logon1->Enabled=false;
//不允許再次登錄}5.3MIMEBase64編碼轉(zhuǎn)換AnsiStringTForm1::encode(AnsiStrings){
intm_len;
//字符串長度
inti;//循環(huán)變量
intm_tmp;
//臨時(shí)變量
AnsiStringm_64code;
//儲(chǔ)存Base64編碼的字符串
char*m_s;
//臨時(shí)存儲(chǔ)參數(shù)字符串
//Base64字符表
charm_64[]=
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
m_len=s.Length();
//取得字符串長度
m_s=s.c_str();
m_64code="";//返回串置空
//處理3的倍數(shù)以內(nèi)的字符
for(i=0;i<m_len-m_len%3;i+=3){m_tmp=m_s/4;m_64code+=m_64[m_tmp];m_tmp=m_s%4*16+m_s[i+1]/16;m_64code+=m_64[m_tmp];m_tmp=m_s[i+1]%16*4+m_s[i+2]/64;m_64code+=m_64[m_tmp];m_tmp=m_s[i+2]%64;m_64code+=m_64[m_tmp];
}
//如果字符串的長度被3除余2,不足的位數(shù)補(bǔ)0,尾部補(bǔ)“=if(m_len%3==2){m_tmp=m_s[m_len-2]/4;m_64code+=m_64[m_tmp];m_tmp=m_s[m_len-2]%4*16+m_s[m_len-1]/16;m_64code+=m_64[m_tmp];m_tmp=m_s[m_len-1]%16*4;m_64code+=m_64[m_tmp];m_64code+='=';
}
//如果字符串的長度被3除余1,不足的位數(shù)補(bǔ)0,尾部補(bǔ)兩個(gè)“=”
if(m_len%3==1){m_tmp=m_s[m_len-1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度煤炭鐵路運(yùn)輸安全監(jiān)管服務(wù)合同4篇
- 二零二五年度智能門禁系統(tǒng)鋪面轉(zhuǎn)租合同書4篇
- 二零二五版深部礦產(chǎn)資源采礦權(quán)抵押擔(dān)保合同模板3篇
- 2025產(chǎn)業(yè)園企業(yè)入駐及產(chǎn)業(yè)扶貧合作合同3篇
- 2025年度美容院美容院美容院美容師薪資福利管理合同4篇
- 2025年私人游艇轉(zhuǎn)讓合同附帶船舶交易后期技術(shù)支持服務(wù)2篇
- 二零二五版電力設(shè)備安裝與維修承包協(xié)議3篇
- 2025年度龍門吊安全監(jiān)控系統(tǒng)集成與維護(hù)合同4篇
- 水庫水面周邊景觀綠化二零二五年度承包合同2篇
- 二零二五年度歷史建筑樓頂廣告租賃服務(wù)協(xié)議4篇
- 2025年山東浪潮集團(tuán)限公司招聘25人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024年財(cái)政部會(huì)計(jì)法律法規(guī)答題活動(dòng)題目及答案一
- 2025年江西省港口集團(tuán)招聘筆試參考題庫含答案解析
- (2024年)中國傳統(tǒng)文化介紹課件
- 液化氣安全檢查及整改方案
- 《冠心病》課件(完整版)
- 2024年云網(wǎng)安全應(yīng)知應(yīng)會(huì)考試題庫
- 公園保潔服務(wù)投標(biāo)方案
- 光伏電站項(xiàng)目合作開發(fā)合同協(xié)議書三方版
- 2024年秋季新滬教版九年級(jí)上冊(cè)化學(xué)課件 第2章 空氣與水資源第1節(jié) 空氣的組成
- 不孕癥診斷、治療新進(jìn)展課件
評(píng)論
0/150
提交評(píng)論