?? 18.htm
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>C++Builder4.0實現在線接收電子郵件</title>
</head>
<div><center>
<table border="0" width="640">
<tr><td align="center"><b>C++Builder4.0實現在線接收電子郵件</b></td></tr>
<tr><td align="center"><font color="#CC9933">李東</font></td></tr>
<tr><td> 我們在使用163、長通飛華等免費電子郵件的時候,會發現這些電子信箱具有在線收發的功能,即可以通過瀏覽器發送和接收郵件電子郵件。這些功能一般是通過CGI實現的,而CGI技術正在逐漸被ISAPI/NSAPI技術所取代,下面的例子使用C++Builder4.0中的ISAPI/NSAPI實現了電子郵件的在線接收。使用C++Builder4開發Web Server程序是非常簡單的,C++Builder 4的VCL提供了大量的元件和對象,支持Web Server程序的開發。<br> 本程序由兩個文件構成,分別為index.htm:接收電子郵件的瀏覽器界面,放到WEB服務器的缺省目錄下(如:C:\Inetpub\wwwroot);ReadMail.dll:在瀏覽器內顯示郵件列表以及指定郵件內容的Web Server Application。這個動態鏈結庫文件放<br>可執行文件路徑下(如C:\Inetpub\scripts)。用戶在瀏覽器內通過Web Server瀏覽index.htm,輸入主機名、端口(一般<br>是110)、用戶名、口令后,首先會看到用戶的郵件列表,單擊相應的郵件序號即可查看郵件內容。<br><br>首先建立index.htm,其內容如下:<br><html><br><head><br><meta http-equiv="Content-Type"<br>content="text/html; charset=gb_2312-80"><br><meta name="GENERATOR" content="Microsoft FrontPage Express 2.0"><br><title>郵件查看</title><br></head><br><body bgcolor="#FFFFFF"><br><form action=" /scripts/MailList.dll/MailList"<br>method="POST"><br><p>主機:<input type="text" size="20" name="Host"></p><br><p>端口:<input type="text" size="20" name="Port"></p><br><p>用戶名:<input type="text" size="20" name="Name"></p><br><p>口令:<input type="password" size="20" name="Code"></p><br><p><input type="submit" name="B1" value="提交"><input<br>type="reset" name="B2" value="復原"></p><br></form><br></body><br></html><br>下面編寫ReadMail.dll<br>在C++Builder中新建一個基于ISAPI的Web Server Application,手動增加<br>NMPOP31,PageProducer1。在Unit1.h頭文件中定義幾個變量:<br>AnsiString HostName,HostPort,UserName,UserCode;<br>TStrings *URLData; // 接受HTTP請求傳遞的參數<br>bool ConnectFlag;<br>int EmailOrder;<br>增加一個路徑為/MailList的動作項,其代碼如下:<br>void __fastcall TWebModule1::WebModule1WebActionItem1Action(<br>TObject *Sender, TWebRequest *Request, TWebResponse *Response,<br>bool &Handled)<br>{<br>//接受HTTP請求傳遞的參數,從中獲取用主機、端口、戶名和口令<br>URLData = NULL;<br>switch(Request->MethodType)<br>{case mtPost:<br>URLData = Request->ContentFields;<br>break;<br>case mtGet:<br>URLData = Request->QueryFields;<br>break;<br>}<br>HostName = URLData->Values["Host"];<br>HostPort = URLData->Values["Port"];<br>UserName = URLData->Values["Name"];<br>UserCode = URLData->Values["Code"];<br><br>//下面開始連接郵件服務器<br>NMPOP31->AttachFilePath=".";//存儲郵件路徑為當前路徑<br>NMPOP31->DeleteOnRead=false;//不刪除服務器上的副本<br>NMPOP31->ReportLevel=Status_Basic;//Status的詳細程度<br>NMPOP31->TimeOut=20000;//設定超時<br>NMPOP31->Host=HostName;<br>NMPOP31->Port=StrToInt(HostPort);<br>NMPOP31->UserID=UserName;<br>NMPOP31->Password=UserCode;<br>ConnectFlag=true;<br>NMPOP31->Connect();<br><br>//如果連接成功,則制作郵件列表的HTML語句<br>if(ConnectFlag)<br>{PageProducer1->HTMLDoc->Clear();<br>PageProducer1->HTMLDoc->Add("<html><body>");<br>PageProducer1->HTMLDoc->Add("郵件個數"+IntToStr(NMPOP31->MailCount));<br>if(NMPOP31->MailCount)<br>for(int i=1;i<=NMPOP31->MailCount;i++)<br>{PageProducer1->HTMLDoc->Add("<a href=''");<br>PageProducer1->HTMLDoc->Add("ReadMail?Mx=");<br>PageProducer1->HTMLDoc->Add(IntToStr(i));<br>PageProducer1->HTMLDoc->Add("''>");<br>PageProducer1->HTMLDoc->Add(IntToStr(i));<br>PageProducer1->HTMLDoc->Add("</a>");}<br>}<br>PageProducer1->HTMLDoc->Add("</body></html>");<br>NMPOP31->Disconnect();}<br>else<br>{PageProducer1->HTMLDoc->Clear();<br>PageProducer1->HTMLDoc->Add("<html><body>");<br>PageProducer1->HTMLDoc->Add("連接服務器失敗!");<br>PageProducer1->HTMLDoc->Add("</body></html>");}<br>//將郵件列表的HTML語句發送給瀏覽器<br>Response->Content = PageProducer1->Content( );<br>}<br>//--------------------------------------------------------------<br>以上部分程序完成了顯示郵件服務器郵件列表的功能。接下來,再增加一<br>個路徑為/MailList的動作項,它的功能是顯示指定的郵件內容。<br>void __fastcall TWebModule1::WebModule1WebActionItem2Action(<br>TObject *Sender, TWebRequest *Request, TWebResponse *Response,<br>bool &Handled)<br>{<br>//接受HTTP請求傳遞的參數,從中獲取用戶名和口令、欲查看的郵件序號<br>URLData = NULL;<br>switch(Request->MethodType)<br>{case mtPost:<br>URLData = Request->ContentFields;<br>break;<br>case mtGet:<br>URLData = Request->QueryFields;<br>break;}<br>EmailOrder = StrToInt(URLData->Values["Mx"]);<br><br>//下面開始連接郵件服務器<br>NMPOP31->AttachFilePath=".";//存儲郵件路徑為當前路徑<br>NMPOP31->DeleteOnRead=false;//不刪除服務器上的副本<br>NMPOP31->ReportLevel=Status_Basic;//Status的詳細程度<br>NMPOP31->TimeOut=20000; //設定超時<br>NMPOP31->Host=HostName;<br>NMPOP31->Port=StrToInt(HostPort);<br>NMPOP31->UserID=UserName;<br>NMPOP31->Password=UserCode;<br>ConnectFlag=true;<br>NMPOP31->Connect();<br><br>//如果連接成功,打開指定的郵件<br>if(ConnectFlag)<br>{PageProducer1->HTMLDoc->Clear();<br>PageProducer1->HTMLDoc->Add("<html><body>");<br>PageProducer1->HTMLDoc->Add("第"+ IntToStr(EmailOrder)+ "個郵件內容:");<br>NMPOP31->GetMailMessage(EmailOrder);<br>PageProducer1->HTMLDoc->AddStrings(NMPOP31->MailMessage->Head);<br>PageProducer1->HTMLDoc->AddStrings(NMPOP31->MailMessage->Body);<br>PageProducer1->HTMLDoc->Add("</body></html>");<br>NMPOP31->Disconnect(); }<br>else<br>{PageProducer1->HTMLDoc->Clear();<br>PageProducer1->HTMLDoc->Add("<html><body>");<br>PageProducer1->HTMLDoc->Add("連接服務器失敗!");<br>PageProducer1->HTMLDoc->Add("</body></html>");}<br>//將顯示指定郵件內容的HTML語句發送給瀏覽器<br>Response->Content = PageProducer1->Content( );<br>}<br>//------------------------------------------------------------<br>最后在NMPOP31的ConnectionFailed事件中加入:<br>void __fastcall TWebModule1::NMPOP31ConnectionFailed(TObject *Sender)<br>{<br>ConnectFlag=false; <br>}<br>//------------------------------------------------------------<br>編譯完成后,將生成的DLL文件更名為和HTML文件相對應的名稱<br>(如:ReadMail.dll),放在C:\Inetpub\scripts即可。以上程序在Pwin98+PWS4上通過。此外,本程序還有不足之處,比如只能查看內容為純文本格式的郵件,沒有處理異常的能力。讀者感興趣的話,不妨改進。</td></tr>
</table></center></div>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -