18.htm

来自「C++Builder教学大全」· HTM 代码 · 共 14 行

HTM
14
字号


<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>C++Builder4.0实现在线接收电子邮件</title>

</head>

<div><center>

<table border="0" width="640">

  <tr><td align="center"><b>C++Builder4.0实现在线接收电子邮件</b></td></tr>

  <tr><td align="center"><font color="#CC9933">李东</font></td></tr>

  <tr><td>&nbsp;&nbsp;    我们在使用163、长通飞华等免费电子邮件的时候,会发现这些电子信箱具有在线收发的功能,即可以通过浏览器发送和接收邮件电子邮件。这些功能一般是通过CGI实现的,而CGI技术正在逐渐被ISAPI/NSAPI技术所取代,下面的例子使用C++Builder4.0中的ISAPI/NSAPI实现了电子邮件的在线接收。使用C++Builder4开发Web Server程序是非常简单的,C++Builder 4的VCL提供了大量的元件和对象,支持Web Server程序的开发。<br>    本程序由两个文件构成,分别为index.htm:接收电子邮件的浏览器界面,放到WEB服务器的缺省目录下(如:C:\Inetpub\wwwroot);ReadMail.dll:在浏览器内显示邮件列表以及指定邮件内容的Web Server Application。这个动态链结库文件放<br>可执行文件路径下(如C:\Inetpub\scripts)。用户在浏览器内通过Web Server浏览index.htm,输入主机名、端口(一般<br>是110)、用户名、口令后,首先会看到用户的邮件列表,单击相应的邮件序号即可查看邮件内容。<br><br>首先建立index.htm,其内容如下:<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv="Content-Type"<br>content="text/html; charset=gb_2312-80"&gt;<br>&lt;meta name="GENERATOR" content="Microsoft FrontPage Express 2.0"&gt;<br>&lt;title&gt;邮件查看&lt;/title&gt;<br>&lt;/head&gt;<br>&lt;body bgcolor="#FFFFFF"&gt;<br>&lt;form action=" /scripts/MailList.dll/MailList"<br>method="POST"&gt;<br>&lt;p&gt;主机:&lt;input type="text" size="20" name="Host"&gt;&lt;/p&gt;<br>&lt;p&gt;端口:&lt;input type="text" size="20" name="Port"&gt;&lt;/p&gt;<br>&lt;p&gt;用户名:&lt;input type="text" size="20" name="Name"&gt;&lt;/p&gt;<br>&lt;p&gt;口令:&lt;input type="password" size="20" name="Code"&gt;&lt;/p&gt;<br>&lt;p&gt;&lt;input type="submit" name="B1" value="提交"&gt;&lt;input<br>type="reset" name="B2" value="复原"&gt;&lt;/p&gt;<br>&lt;/form&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br>下面编写ReadMail.dll<br>在C++Builder中新建一个基于ISAPI的Web Server Application,手动增加<br>NMPOP31,PageProducer1。在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-&gt;MethodType)<br>{case mtPost:<br>URLData = Request-&gt;ContentFields;<br>break;<br>case mtGet:<br>URLData = Request-&gt;QueryFields;<br>break;<br>}<br>HostName = URLData-&gt;Values["Host"];<br>HostPort = URLData-&gt;Values["Port"];<br>UserName = URLData-&gt;Values["Name"];<br>UserCode = URLData-&gt;Values["Code"];<br><br>//下面开始连接邮件服务器<br>NMPOP31-&gt;AttachFilePath=".";//存储邮件路径为当前路径<br>NMPOP31-&gt;DeleteOnRead=false;//不删除服务器上的副本<br>NMPOP31-&gt;ReportLevel=Status_Basic;//Status的详细程度<br>NMPOP31-&gt;TimeOut=20000;//设定超时<br>NMPOP31-&gt;Host=HostName;<br>NMPOP31-&gt;Port=StrToInt(HostPort);<br>NMPOP31-&gt;UserID=UserName;<br>NMPOP31-&gt;Password=UserCode;<br>ConnectFlag=true;<br>NMPOP31-&gt;Connect();<br><br>//如果连接成功,则制作邮件列表的HTML语句<br>if(ConnectFlag)<br>{PageProducer1-&gt;HTMLDoc-&gt;Clear();<br>PageProducer1-&gt;HTMLDoc-&gt;Add("&lt;html&gt;&lt;body&gt;");<br>PageProducer1-&gt;HTMLDoc-&gt;Add("邮件个数"+IntToStr(NMPOP31-&gt;MailCount));<br>if(NMPOP31-&gt;MailCount)<br>for(int i=1;i&lt;=NMPOP31-&gt;MailCount;i++)<br>{PageProducer1-&gt;HTMLDoc-&gt;Add("&lt;a href=''");<br>PageProducer1-&gt;HTMLDoc-&gt;Add("ReadMail?Mx=");<br>PageProducer1-&gt;HTMLDoc-&gt;Add(IntToStr(i));<br>PageProducer1-&gt;HTMLDoc-&gt;Add("''&gt;");<br>PageProducer1-&gt;HTMLDoc-&gt;Add(IntToStr(i));<br>PageProducer1-&gt;HTMLDoc-&gt;Add("&lt;/a&gt;");}<br>}<br>PageProducer1-&gt;HTMLDoc-&gt;Add("&lt;/body&gt;&lt;/html&gt;");<br>NMPOP31-&gt;Disconnect();}<br>else<br>{PageProducer1-&gt;HTMLDoc-&gt;Clear();<br>PageProducer1-&gt;HTMLDoc-&gt;Add("&lt;html&gt;&lt;body&gt;");<br>PageProducer1-&gt;HTMLDoc-&gt;Add("连接服务器失败!");<br>PageProducer1-&gt;HTMLDoc-&gt;Add("&lt;/body&gt;&lt;/html&gt;");}<br>//将邮件列表的HTML语句发送给浏览器<br>Response-&gt;Content = PageProducer1-&gt;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-&gt;MethodType)<br>{case mtPost:<br>URLData = Request-&gt;ContentFields;<br>break;<br>case mtGet:<br>URLData = Request-&gt;QueryFields;<br>break;}<br>EmailOrder = StrToInt(URLData-&gt;Values["Mx"]);<br><br>//下面开始连接邮件服务器<br>NMPOP31-&gt;AttachFilePath=".";//存储邮件路径为当前路径<br>NMPOP31-&gt;DeleteOnRead=false;//不删除服务器上的副本<br>NMPOP31-&gt;ReportLevel=Status_Basic;//Status的详细程度<br>NMPOP31-&gt;TimeOut=20000; //设定超时<br>NMPOP31-&gt;Host=HostName;<br>NMPOP31-&gt;Port=StrToInt(HostPort);<br>NMPOP31-&gt;UserID=UserName;<br>NMPOP31-&gt;Password=UserCode;<br>ConnectFlag=true;<br>NMPOP31-&gt;Connect();<br><br>//如果连接成功,打开指定的邮件<br>if(ConnectFlag)<br>{PageProducer1-&gt;HTMLDoc-&gt;Clear();<br>PageProducer1-&gt;HTMLDoc-&gt;Add("&lt;html&gt;&lt;body&gt;");<br>PageProducer1-&gt;HTMLDoc-&gt;Add("第"+ IntToStr(EmailOrder)+ "个邮件内容:");<br>NMPOP31-&gt;GetMailMessage(EmailOrder);<br>PageProducer1-&gt;HTMLDoc-&gt;AddStrings(NMPOP31-&gt;MailMessage-&gt;Head);<br>PageProducer1-&gt;HTMLDoc-&gt;AddStrings(NMPOP31-&gt;MailMessage-&gt;Body);<br>PageProducer1-&gt;HTMLDoc-&gt;Add("&lt;/body&gt;&lt;/html&gt;");<br>NMPOP31-&gt;Disconnect(); }<br>else<br>{PageProducer1-&gt;HTMLDoc-&gt;Clear();<br>PageProducer1-&gt;HTMLDoc-&gt;Add("&lt;html&gt;&lt;body&gt;");<br>PageProducer1-&gt;HTMLDoc-&gt;Add("连接服务器失败!");<br>PageProducer1-&gt;HTMLDoc-&gt;Add("&lt;/body&gt;&lt;/html&gt;");}<br>//将显示指定邮件内容的HTML语句发送给浏览器<br>Response-&gt;Content = PageProducer1-&gt;Content( );<br>}<br>//------------------------------------------------------------<br>最后在NMPOP31的ConnectionFailed事件中加入:<br>void __fastcall TWebModule1::NMPOP31ConnectionFailed(TObject *Sender)<br>{<br>ConnectFlag=false; <br>}<br>//------------------------------------------------------------<br>编译完成后,将生成的DLL文件更名为和HTML文件相对应的名称<br>(如:ReadMail.dll),放在C:\Inetpub\scripts即可。以上程序在Pwin98+PWS4上通过。此外,本程序还有不足之处,比如只能查看内容为纯文本格式的邮件,没有处理异常的能力。读者感兴趣的话,不妨改进。</td></tr> 

</table></center></div> 

</html> 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?