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