Le but de ce didactitiel est de vous faire découvrir pas à pas,
la construction d'une application pour le web avec Delphi 5/6. Il ne sera pas
question ici, de faire le tour des technologies et possibilités
offertes par la dernière version de l'outil de programmation,
mais simplement de vous donner la marche à suivre pour créer une application portable.
|
unit uSendMailIsapi;
(*-------------------------------------------------------------------
Le but de cet exemple est de démontrer la simplicité du développement
pour le web avec Delphi.
- Vos objets Delphi sont écrit comme pour une application classique
- Il suffit ensuite d'écrire les interfaces ISAPI / CGI ou Objet Com ASP
pour les utiliser sur le web.
Cette méthode présente également l'avantage de pouvoir tester vos objets
sans avoir recours à un serveur web et à séparer les problèmes éventuels
liés à chaques parties (L'objet Delphi, La DLL Isapi, ect)
TMailISAPI
-----------
Hiérarchie : TBaseObject (Objet commun ISAPI / ASP)
|
TCustomISAPI (Objet Commun aux ISAPIs)
|
TMailISAPI (encapsule TObjetcSendMail)
Cet objet ne fait pas grand chose d'autre que de proposer une
interface ISAPI pour l'objet TObjetcSendMail (commun à toutes les technos
Progamme Windows, ISAPI, ASP)
ATTENTION
--------
Ne pas utiliser la version fichiers textes du Sendmail en production.
Vous devez développer une version base de données ou consulter le site
web www.delphiCenter.net pour voir si il existe d'autres versions
Version 1.0, copyrigth www.delphiCenter.net Mai 2001
Auteur : JJM
Email de l'auteur : jjm@delphiCenter.net
------------------------------------------------------------------*)
interface
Uses Windows, Messages, SysUtils, Classes, uCustomIsapi, uCustomSendMail,
isapiapp,HTTPApp;
Type
TMailISAPI = Class(TCustomISAPI)
fDefaultSender: String;
fDefaultPassword:String;
fSendMail : TObjectSendMail;
fNextUrl : String;
fNextUrlRpt : String;
fFileReport : String;
fReportPageHtm : String;
Private
function NextExpr(Var S:String) : String;
Procedure SpareTags;
procedure SpareParams;
procedure SpareFiles;
procedure DefaultReportHtm;
procedure LoadReportHtm;
function GetErrorsObject : String;
function GetDefaultHost : String;
Function SeekTags(sText:String):String;
Public
Constructor Create (aRequest: TWebRequest); Override;
Destructor Destroy; Override;
function ShowReport : String;
Function Send : Integer;
Property Mail : TObjectSendMail Read fSendMail;
Property FileReport : String Read fFileReport Write fFileReport;
Property ErrorsObjectHtm : String Read GetErrorsObject;
Property NextUrl : String Read fNextUrl;
Property NextUrlRpt : String Read fNextUrlRpt;
end;
implementation
uses Inifiles, uConstSendMail;
Const cSep =';';
{ TMailISAPI }
constructor TMailISAPI.Create(aRequest: TWebRequest);
begin
inherited;
fSendMail:=TObjectSendMail.create(Nil);
fDefaultSender:='';
fDefaultPassword:='';
SpareParams;
end;
destructor TMailISAPI.Destroy;
begin
inherited;
fSendMail.free;
end;
procedure TMailISAPI.SpareParams;
begin
With RequestContent do
begin
// Serveur SMTP
fSendMail.Host:=SetStrValueToStr(Values['HOST'],GetDefaultHost);
fSendMail.AddSender(SetStrValueToStr(Values['SENDER'],fDefaultSender));
fSendMail.Password:=SetStrValueToStr(Values['PASSWORD'],fDefaultPassword);
// Exp & Destinataires
fSendMail.AddCC(Values['CC']);
fSendMail.AddBCC(Values['BCC']);
fSendMail.AddTo(Values['TO']);
fSendMail.AddReplyTo(Values['REPLYTO']);
fSendMail.AddFrom(Values['FROM']);
SpareFiles;
// Options du mail
fSendMail.SetPriority(SetStrValueToInt(Values['PRIORITY'],2));
fSendMail.Date:=SetStrValueToDate(Values['DATE'],Date);
fSendMail.ReceiptRecipient.Text:=SetStrValueToStr(Values['RECEPT'],'');
fSendMail.ContentType:=SetStrValueToStr(Values['CONTENTTYPE'],'TEXT/PLAIN');
fSendMail.Charset:=SetStrValueToStr(Values['CHARSET'],'iso-8859-1');
// TraceLogs des mails envoyés
fSendMail.SaveLog:=SetStrValueToBool(Values['SAVELOG'],True);
if Values['FILELOG']<>'' then
fSendMail.FileLog:=SetFilePath(Values['FILELOG']);
// Redirections
fNextUrl:=Values['NEXTURL'];
fNextUrlRpt:=SetStrValueToStr(Values['NEXTURLRPT'],Request.Url);
SpareTags;
fFileReport :=SetFilePath(Values['REPORT']);
// Message
fSendMail.SUBJECT:=Values['SUBJECT'];
if Values['BODYFILE']<>'' then
begin
if LowerCase(fSendMail.ContentType)='text/plain' then
fSendMail.LoadFromFile(SetFilePath(Values['BODYFILE']))
else
begin
fSendMail.AddText('');
fSendMail.AddHtml(SeekTags(LoadTxtFile(SetFilePath(Values['BODYFILE']))));
end;
end
else
if Values['BODY']<>'' then
fSendMail.Body.text:=SeekTags(Values['BODY']);
end;
end;
function TMailISAPI.NextExpr(Var S:String) : String;
// Renvoi la partie de la chaÎne située avant le séparateur const cSep
Var i : Integer;
Begin
I:=Pos(cSep,S);
if I>0 then
begin
Result:=System.Copy(S,1,i-1);
System.Delete(S,1,I);
end
else
begin
Result:=S;
S:='';
end;
end;
Procedure TMailISAPI.SpareTags;
Var i : Integer;
S,
sTag, sValue : String;
begin
// Remplace les "marques" par les valeurs indiquées
i:=1;
S:=RequestContent.Values['TAG'+IntToStr(i)];
While S<>'' do
begin
sTag:=NextExpr(S);
sValue:=NextExpr(S);
fSendMail.SetTag(sTag, sValue);
inc(i);
S:=RequestContent.Values['TAG'+IntToStr(i)]
end;
end;
Procedure TMailISAPI.SpareFiles;
Var i : Integer;
S : String;
begin
// Attaches les fichiers désignés
i:=1;
S:=RequestContent.Values['FILES'+IntToStr(i)];
While S<>'' do
begin
fSendMail.AddAttachment(SetFilePath(S));
inc(i);
S:=RequestContent.Values['FILES'+IntToStr(i)]
end;
end;
function TMailISAPI.GetDefaultHost: String;
Var MyIni : TIniFile;
begin
// Paramètres par défaut, pour l'envoi de mails
MyIni:=TInifile.create(IniFileName);
try
With MyIni do
begin
// Chargement du template
Result:=ReadString('SERVER','HOST','');
fDefaultSender:=ReadString('SERVER','SENDER','');
fDefaultPassword:=ReadString('SERVER','PASSWORD','');
end;
finally
Myini.free;
end;
end;
procedure TMailISAPI.DefaultReportHtm;
Var MyIni : TIniFile;
begin
MyIni:=TInifile.create(IniFileName);
try
With MyIni do
begin
// Chargement du template
fReportPageHtm:=LoadTxtFile(ReadString('REPORTS','ReportPage',''));
end;
finally
Myini.free;
end;
end;
procedure TMailISAPI.LoadReportHtm;
begin
// Charge le template de rapport désigné par fFileReport
if FileExists(fFileReport) then
fReportPageHtm:=LoadTxtFile(fFileReport)
else
begin
DefaultReportHtm;
AddError(fFileReport+' est introuvable');
end;
end;
function TMailISAPI.ShowReport : String;
begin
// Affichage du rapport d'expédition
if fFileReport<>'' then
LoadReportHtm // Lecture du fichier "template" désigné
else
DefaultReportHtm; // Lecture du fichier "template" par défaut
Result:=fSendMail.MakeReport(fReportPageHtm);
// si une url est définie après le rapport;
ReplaceTag(Result,'#nextUrlRpt',NextUrlRpt);
ReplaceTag(Result,'#ErrorsISAPIHtm',ErrorsISAPIHtm);
end;
function TMailISAPI.Send: Integer;
begin
Result:=fSendMail.Send;
end;
function TMailISAPI.GetErrorsObject: String;
begin
Result:=fSendMail.GetErrorsHtm;
end;
Function TMailISAPI.SeekTags(sText:String):String;
Var sBody : String;
begin
// recherche d'éventuelles marques à remplacer
sText:=fSendMail.MakeBody(sText);
sBody:=SeekLinks(RequestContent.Values['BODY']);
if LowerCase(fSendMail.ContentType)='text/plain' then
ReplaceTag(sText,tagBody,sBody)
Else
ReplaceTag(sText,tagBody,SetCr2Br(sBody));
Result:=sText;
end;
end.
|
|