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.


(C)Cotelem Mai 2001   Accueil   Retour