📄 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 + -