常,實作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 >
< 身體 >
< 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 >
< /身體 >
< /html >
qd.html文件內容如下:
< html >< head >< title >填表< /title >< /head >
< 身體 >
< 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=”身體” >< /p >
< p >< input type="submit" value="確定" >
< input type="reset" value="清除" >< /p >
< /form >
< /身體 >
< /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 >< 身體 >使用者名稱、密碼不正確,請重新輸入
< /身體 >< /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 >< 身體 >');
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
('< /身體 >< /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的使用者輸入,並且如果使用者的使用者名稱及密碼正確則可進入發送郵件的頁面,使用者填寫接受郵件地址及主題、內容後即可發送郵件。此程式在NT SERVER上調試通過。