程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ Builder實現在線接收電子郵件

C++ Builder實現在線接收電子郵件

編輯:關於C++

我們在使用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上通過。此外,本程序還有不足之處,比如只能查看內容為純文本格式的郵件,沒有處理異常的能力。讀者感興趣的話,不妨改進。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved