?? lc_bcb_11.html
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>C++Builder4.0實現在線接收電子郵件</title>
</head>
<body>
<p align="center"><big><strong>C++Builder4.0實現在線接收電子郵件<br>
<br>
河南濮陽中原油田計算中心 李東</strong></big></p>
<p><br>
我們在使用163、長通飛華等免費電子郵件的時候,會發現這些電子信箱具有在線收發的功能,即可以通過<br>
瀏覽器發送和接收郵件電子郵件。這些功能一般是通過CGI實現的,而CGI技術正在逐漸被ISAPI/NSAPI技術<br>
所取代,下面的例子使用C++Builder4.0中的ISAPI/NSAPI實現了電子郵件的在線接收。使用C++Builder4開<br>
發Web Server程序是非常簡單的,C++Builder 4的VCL提供了大量的元件和對象,支持Web
Server程序的開<br>
發。<br>
本程序由兩個文件構成,分別為<br>
index.htm:接收電子郵件的瀏覽器界面,放到WEB服務器的缺省目錄下(如:C:\Inetpub\wwwroot);<br>
ReadMail.dll:在瀏覽器內顯示郵件列表以及指定郵件內容的Web Server
Application。這個動態鏈結庫<br>
文件放在可執行文件路徑下(如C:\Inetpub\scripts)。<br>
用戶在瀏覽器內通過Web Server瀏覽index.htm,輸入主機名、端口(一般是110)、用戶名、口令后,首<br>
先會看到用戶的郵件列表,單擊相應的郵件序號即可查看郵件內容。<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,手動增加NMPOP31,PageProducer1。在<br>
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>
以上部分程序完成了顯示郵件服務器郵件列表的功能。接下來,再增加一個路徑為/MailList的動作項,<br>
它的功能是顯示指定的郵件內容。<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文件相對應的名稱(如:ReadMail.dll),放在C:\Inetpub\<br>
scripts即可。以上程序在Pwin98+PWS4上通過。<br>
此外,本程序還有不足之處,比如只能查看內容為純文本格式的郵件,沒有處理異常的能力。讀者感興趣<br>
的話,不妨改進</p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -