實現WEBMAIL采用mailto.exe的CGI、在HTML文件中寫入“< form action="mailto:電子郵箱地址" method=post >”語句或者調用WINDOWS API函數。采用Windows API 和在Html文件中寫入“< form action="mailto:電子郵箱地址" method=post >”語句都要求用戶的浏覽器裝入Exchange、OUTLOOKEXPRESS、或OUTLOOK等軟件,而且還有一些浏覽器不支持MAILTO語句。而采用CGI的形式實現WEBMAIL對用戶的浏覽器沒有要求,但效率不高。CGI技術正在逐漸被ISAPI/NSAPI技術所取代。本文就來討論一下采用ISAPI技術實現WEBMAIL。
使用Delphi 4開發Web Server程序是非常簡單的,Delphi 4中提供了大量的元件和對象,支持Web Server程序的開發。 下面通過一個例子來介紹如何利用Delphi開發一個響應用戶輸入的ISAPI的WEBMAIL程序。只有在發送服務器上注冊的用戶才能通過在浏覽器發送郵件。為了簡單,程序沒有對傳送的數據提供保密。
首先,在WEB服務器端安裝數據庫引擎dbe,並設置好數據庫別名:yh,指向一個包含用戶名和用戶密碼的數據庫文件user.db。接著建立兩個HTML文件,名字分別為:dl.html,qd.Html,放在WEB服務器的缺省目錄下(如:C:INETPUBWWWROOT)。
dl.Html的內容如下:
< Html >
< head >< title > 發送郵件系統< /title >< /head >
< body >
< h1 >發送郵件系統< /h1 >
< p > 請輸入您的用戶名及密碼。< /p >
< form method=”post” action="/scripts/xsmd" >
< p >用戶名:< input type="text" length=10
name="username" >
密碼:< input type="passWord"
length=10 name="passWord" >< /p >
< p >< input type="submit" value="確定" >
< input type="reset" value="清除" >< /p >
< /form >
< /body >
< /Html >
qd.Html文件內容如下:
< Html >< head >< title >填表< /title >< /head >
< body >
< form method=”post” action="feedback" >
< p >請填入接收郵件地址:toaddress:
< input type=”text” length=20
name=”toaddress” >< /p >
< p >請填入主題。< input type="text"
length=20 name="subject" >< /p >
< p >內容:< /p >
< p >< input type=“textarea”length=40
width=40 name=”body” >< /p >
< p >< input type="submit" value="確定" >
< input type="reset" value="清除" >< /p >
< /form >
< /body >
< /Html >
在Delphi中新建一個基於ISAPI的WEB SERVER APPLICATION,手動增加nmsmtp1,query1,pageproducer1。
其中:pageproducer1的property: htmlfile:c:inetpubwww.rootqd.Html。nmsmtp1的 property:host(發送郵件服務器的地址。)在這裡為smtp.Netease.com.。port:25。 全局變量為: sername:string;flag:boolean;
增加一個路徑為/feedback的動作項,其代碼如下:
procedure TWebModule1.WebModule1WebActionItem1
Action(Sender: TObject;
Request: TWebRequest; Response:
TWebResponse; var Handled: Boolean);
Var Count:integer;
S:string;
Begin
Query1.close;
Query1.sql.clear;
S:=’select count(username) from
user.db where username=”’;
S:=s+request.contentfIElds.values[‘username’]+’”’;
S:=s+’ and passWord=”’;
S:=s+request.contentfIElds.values[‘psWord’]+’”’;
Query1.sql.add(S);
Query1.open;
If query1.count=0
then response.content:=’< Html >< head >< title >
< /title >< body >用戶名、密碼不正確,請重新輸入
< /body >< /Html >’
Else
Username:=request.contentfIElds.values[‘username’];
Response.content:=pageproducer1.content;
End;
再增加一個路徑為/sendmail 的動作項,
它的程序代碼如下:
procedure TWebModule1.WebModule1Web
ActionItem2Action(Sender: TObject;
Request: TWebRequest; Response:
TWebResponse; var Handled: Boolean);
Var body:string;
Begin
Flag:=true;
body:=request.contentfIElds.values[‘body’];
Pageproducer1.Htmldoc.clear;
Pageproducer1.htmldoc.add(‘< Html >< body >’);
Nmsmtp1.postmessage.clear;
Nmsmtp1.postmessage.fromaddress:=username+
’@netease.com’;
Nmsmtp1.postmessage.from:=username;
Nmsmtp1.postmessage.body.add(body);
Nmsmtp1.postmessage.toaddress.add
(request.contentfIElds.values[‘toaddress’]);
Nmsmtp1.postmessage.subject:=
request.contentfIElds.values[‘subject’];
Nmsmtp1.connect;
If flag=true then begin Nmsmtp1.sendmail;
nmsmtp1.disconntent;end
pageproducer1.Htmldoc.add
(‘< /body >< /Html >’);
response.content:=pageproducer1.content;
end;
增加nmsmtp1的事件如下:
procedure TWebModule1.NMSMTP1Connect(Sender: TObject);
begin
pageproducer1.Htmldoc.add
('< p >已經和發送郵件服務器連接< /p >');
end;
procedure TWebModule1.NMSMTP1Connection
Failed(Sender: TObject);
begin
flag:=false;
pageproducer1.Htmldoc.add
('< p >連接失敗< /P >');
end;
procedure TWebModule1.NMSMTP1ConnectionRequired
(var Handled: Boolean);
begin
pageproducer1.Htmldoc.add('< p >要求進行連接< /p >');
end;
procedure TWebModule1.NMSMTP1Failure(Sender: TObject);
begin
pageproducer1.Htmldoc.add('< p >發送郵件失敗< /p >');
flag:=false;
end;
procedure TWebModule1.NMSMTP1Header
Incomplete(var handled: Boolean;
hiType: Integer);
begin
pageproducer1.Htmldoc.add('< p >head不完整< /p >');
flag:=false;
end;
procedure TWebModule1.NMSMTP1InvalidHost
(var Handled: Boolean);
begin
pageproducer1.Htmldoc.add('< p >
發送郵件服務器地址無效< /p >');
flag:=false;
end;
procedure TWebModule1.NMSMTP1RecipIEntNot
Found(RecipIEnt: String);
begin
pageproducer1.Htmldoc.add
('< p >接受郵件地址不正確< /p >');
flag:=false;
end;
procedure TWebModule1.NMSMTP1Success(
Sender: TObject);
begin
pageproducer1.Htmldoc.add('< p >
成功發送郵件< /p >');
end;
將project存為sendmail.dpr,編譯後放到WEB服務器的可執行文件路徑下(如:c:intpubscripts),即可響應Html文件dl.htm的用戶輸入,並且如果用戶的用戶名及密碼正確則可進入發送郵件的頁面,用戶填寫接受郵件地址及主題、內容後即可發送郵件