?? 20000725001.htm
字號:
<HTML>
<HEAD>
<TITLE>C++Builder4.0實現在線接收電子郵件</TITLE>
<META content="MSHTML 5.00.2314.1000" name=GENERATOR>
</HEAD>
<BODY aLink=#FF0000 bgColor=#ffffff leftMargin=0 link=#187800 topMargin=0
vLink=#990099>
<div align="center">
<table>
<tr>
<td>
<p align=center><font size=5><strong><b><font size="3"><br>
<br>
C++Builder4.0實現在線接收電子郵件</font></b></strong></font></p>
<p align=right>(文/李東)</p>
<p class=sfont> 我們在使用163、長通飛華等免費電子郵件的時候,會發現這些電子信箱具有在線收發的功能,即可以通過瀏覽器發送和接收郵件電子郵件。這些功能一般是通過CGI實現的,而CGI技術正在逐漸被ISAPI/NSAPI技術所取代,下面的例子使用C++Builder4.0中的ISAPI/NSAPI實現了電子郵件的在線接收。
<br>
使用C++Builder4開發Web Server程序是非常簡單的,C++Builder 4的VCL提供了大量的元件和對象,支持Web
Server程序的開發。本程序由兩個文件構成,分別為index.htm:接收電子郵件的瀏覽器界面,放到WEB服務器的缺省目錄下(如:C:\Inetpub\wwwroot);ReadMail.dll:在瀏覽器內顯示郵件列表以及指定郵件內容的Web
Server Application。這個動態鏈結庫文件放在可執行文件路徑下(如C:\Inetpub\scripts)。用戶在瀏覽器內通過Web
Server瀏覽index.htm,輸入主機名、端口(一般是110)、用戶名、口令后,首先會看到用戶的郵件列表,單擊相應的郵件序號即可查看郵件內容。
</p>
<p>首先建立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>
<p>下面編寫ReadMail.dll <br>
在C++Builder中新建一個基于ISAPI的Web Server Application,手動增加
<p>NMPOP31,PageProducer1。在Unit1.h頭文件中定義幾個變量: <br>
AnsiString HostName,HostPort,UserName,UserCode; <br>
TStrings *URLData; // 接受HTTP請求傳遞的參數 <br>
bool ConnectFlag; <br>
int EmailOrder;
<p>增加一個路徑為/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"];
<p>//下面開始連接郵件服務器 <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();
<p>//如果連接成功,則制作郵件列表的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"]);
<p>//下面開始連接郵件服務器 <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();
<p>//如果連接成功,打開指定的郵件 <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\scr<br>
ipts即可。以上程序在Pwin98+PWS4上通過。此外,本程序還有不足之處,比如只能查看內容為純文本格式的郵件, 沒有處理異常的能力。讀者感興趣的話,不妨改進。
</p>
</td>
</tr>
</table>
</div>
</BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -