-
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上通过。此外,本程序还有不足之处,比如只能查看内容为纯文本格式的邮件,没有处理异常的能力。读者感兴趣的话,不妨改进。
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比