基于BCB開發具有身份認證功能的郵件發送程序_第1頁
基于BCB開發具有身份認證功能的郵件發送程序_第2頁
基于BCB開發具有身份認證功能的郵件發送程序_第3頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基于BCB開發具有身份認證功能的郵件發送程序

摘要本文介紹了如何增強BCB中發送電子郵件的NMSMTP控件的功能,實現具有身份認證功能的郵件發送程序。關鍵詞ESMTP,MIME,身份認證1引言為了更有效地抑制垃圾郵件的泛濫,目前多數網站的郵件收發系統都使用了ESMTP服務的身份認證功能。即用戶發送郵件時,需要對用戶的身份進行驗證,如果帳號或密碼錯誤,郵件服務器會拒絕發送郵件。BorlandC++Builder6中有豐富的控件供開發者使用,其中當然也包括郵件發送控件NMSMTP,這個控件使用方便,但是惟一的缺點是不支持郵件發送時的身份認證功能。筆者通過對郵件發送協議的分析,在使用控件的基礎上設計了具有身份認證功能的郵件發送程序。2ESMTP協議分析為了實現身份認證功能,目前ESMTP協議中增加了一部分內容,這就是身份認證。下面我們看看這段認證過程,以筆者在網易的郵箱為例(其中C表示客戶端,S表示郵件服務器):(1)C:AUTHLOGIN(2)S:334dXNlcm5hbWU6(3)C:d3lxX2puX3NkX2Nu(4)S:334UGFzc3dvcmQ6(5)C:密碼略去(6)S:235Authenticationsuccessful詳細說明:(1)客戶端向服務器發送認證指令。(2)服務器返回Base64編碼串,334意味成功。編碼字符串解碼后為"username:",說明要求客戶端發送用戶名。(3)客戶端發送Base64編碼的用戶名串,此處為"wyq_jn_sd_cn"。(4)服務器返回Base64編碼串,334意味成功。編碼字符串解碼后為"password:",說明要求客戶端發送用戶口令。(5)客戶端發送Base64編碼的口令串,此處略去。(6)服務器返回普通字符串,235意味成功,表示認證成功可以發送郵件了。3MIMEBase64編碼解釋一般的計算機編碼的一個字節是8bit,0——FF就是256種不同的8bit組合。我們現在要介紹的這種Base64編碼則是每個字節6bit,共有26=64種組合。其中每種組合對應一個字符,這些字符是“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/。”這就意味著每3個普通編碼可以轉換成4個Base64編碼,那么如果需要轉換的普通編碼不是3的整數倍怎么辦?Base64規定,位數不足的字節后面補0,然后差幾個字符補幾個‘=’號。4設計思路我們可以使用NMSMTP控件與郵件服務器連接。通過調用Connect方法,然后監聽OnConnect事件;在OnConnect事件里我們可以增加身份認證功能。這里是主要利用了NMSMTP從Powersock中繼承的一些基本網絡通訊函數,包括Read,DataAvailable,SendBuffer等來實現身份認證過程。如果身份認證成功,就可以繼續進行郵件發送;否則,提示錯誤信息,斷開網絡連接。5程序實現

使用BCB設計如圖1所示的窗體。圖1程序主界面5.1在登錄按鈕的onClick事件中調用連接函數void__fastcallTForm1::Logon1Click(TObject*Sender){

AddLog("正在登錄"+Edit1->Text+"");

NMSMTP1->Host=Edit1->Text;

//主機地址

NMSMTP1->Port=25;

//主機端口,缺省為25

NMSMTP1->UserID=Edit4->Text;

//用戶名

NMSMTP1->Connect();

//連接主機}5.2處理OnConnect事件void__fastcallTForm1::NMSMTP1Connect(TObject*Sender){AddLog("連接服務器成功。");AnsiStringData="",rData="";boolb_ok;if(CheckBox1->Checked){

Data="AUTHLOGIN\r\n";

//登錄請求命令

NMSMTP1->SendBuffer(Data.c_str(),Data.Length());//命令發出

rData=WaitForReply(5);

//等待接收返回數據,5秒內必須返回

b_ok=false;

if(rData.Length()>=3){

//334意味著服務器要求輸入用戶名

if(rData.TrimLeft().SubString(0,3)=="334"){AddLog("正在驗證身份");b_ok=true;

}

}

if(!b_ok){

AddLog("登錄失敗,正在退出");

NMSMTP1->Disconnect();

return;rData="";

Data=encode(Edit4->Text)+"\r\n";

//用戶名轉換為Base64編碼。

NMSMTP1->SendBuffer(Data.c_str(),Data.Length());//發送用戶名

rData=WaitForReply(5);

b_ok=false;

if(rData.Length()>=3){

//334意味著服務器要求輸入口令

if(rData.TrimLeft().SubString(0,3)=="334"){AddLog("正在驗證口令");b_ok=true;

}

}

if(!b_ok){

AddLog("登錄失敗,正在退出");

NMSMTP1->Disconnect();

return;

}

rData="";

Data=encode(Edit5->Text)+"\r\n";//口令轉換成Base64編碼。

NMSMTP1->SendBuffer(Data.c_str(),Data.Length());//發送口令

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;

//允許發送郵件disconnect->Enabled=true;

//允許斷開連接Logon1->Enabled=false;

//不允許再次登錄}5.3MIMEBase64編碼轉換AnsiStringTForm1::encode(AnsiStrings){

intm_len;

//字符串長度

inti;//循環變量

intm_tmp;

//臨時變量

AnsiStringm_64code;

//儲存Base64編碼的字符串

char*m_s;

//臨時存儲參數字符串

//Base64字符表

charm_64[]=

"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

m_len=s.Length();

//取得字符串長度

m_s=s.c_str();

m_64code="";//返回串置空

//處理3的倍數以內的字符

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,不足的位數補0,尾部補“=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,不足的位數補0,尾部補兩個“=”

if(m_len%3==1){m_tmp=m_s[m_len-1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論