-
c语言入门之C++Builder4.0实现在线接收电子邮件
作者:李东
我们在使用163、长通飞华等免费电子邮件的时候,会发现这些电子信箱具有在线收发的功能,即可以通过浏览器发送和接收邮件电子邮件。这些功能一般是通过CGI实现的,而CGI技术正在逐渐被ISAPI/NSAPI技术所取代,下面的例子使用C++Builder4.0中的ISAPI/NSAPI实现了电子邮件的在线接收。使用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)、用户名、口令后,首先会看到用户的邮件列表,单击相应的邮件序号即可查看邮件内容。
首先建立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::WebModule1WebActionItem1Action(
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;
}
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><body>");
PageProducer1->HTMLDoc->Add("连接服务器失败!");
PageProducer1->HTMLDoc->Add("</body></html>");}
//将邮件列表的HTML语句发送给浏览器
Response->Content = PageProducer1->Content( );
}
//--------------------------------------------------------------
以上部分程序完成了显示邮件服务器邮件列表的功能。接下来,再增加一
个路径为/MailList的动作项,它的功能是显示指定的邮件内容。
void __fastcall TWebModule1::WebModule1WebActionItem2Action(
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::NMPOP31ConnectionFailed(TObject *Sender)
{
ConnectFlag=false;
}
//------------------------------------------------------------
编译完成后,将生成的DLL文件更名为和HTML文件相对应的名称
(如:ReadMail.dll),放在C:\Inetpub\scripts即可。以上程序在Pwin98+PWS4上通过。此外,本程序还有不足之处,比如只能查看内容为纯文本格式的邮件,没有处理异常的能力。读者感兴趣的话,不妨改进。
我们在使用163、长通飞华等免费电子邮件的时候,会发现这些电子信箱具有在线收发的功能,即可以通过浏览器发送和接收邮件电子邮件。这些功能一般是通过CGI实现的,而CGI技术正在逐渐被ISAPI/NSAPI技术所取代,下面的例子使用C++Builder4.0中的ISAPI/NSAPI实现了电子邮件的在线接收。使用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)、用户名、口令后,首先会看到用户的邮件列表,单击相应的邮件序号即可查看邮件内容。
首先建立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::WebModule1WebActionItem1Action(
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;
}
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><body>");
PageProducer1->HTMLDoc->Add("连接服务器失败!");
PageProducer1->HTMLDoc->Add("</body></html>");}
//将邮件列表的HTML语句发送给浏览器
Response->Content = PageProducer1->Content( );
}
//--------------------------------------------------------------
以上部分程序完成了显示邮件服务器邮件列表的功能。接下来,再增加一
个路径为/MailList的动作项,它的功能是显示指定的邮件内容。
void __fastcall TWebModule1::WebModule1WebActionItem2Action(
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::NMPOP31ConnectionFailed(TObject *Sender)
{
ConnectFlag=false;
}
//------------------------------------------------------------
编译完成后,将生成的DLL文件更名为和HTML文件相对应的名称
(如:ReadMail.dll),放在C:\Inetpub\scripts即可。以上程序在Pwin98+PWS4上通过。此外,本程序还有不足之处,比如只能查看内容为纯文本格式的邮件,没有处理异常的能力。读者感兴趣的话,不妨改进。
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式