IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Indy et email au format enrichi


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Points : 69
    Points
    69
    Par défaut Indy et email au format enrichi
    Bonjour

    J'utilise indy dans mon application pour l'envoi d'Emails.
    Pour la rédaction du message j'utilise Richedit

    Pour l'instant je peux envoyer que des messages en mode texte simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      msg.Body.Text:=utf8toAnsi(Richmemo1.Text);
    Ce que j'envisage, c'est envoyer des messages Email au format enrichi de type RTF ou HTLM

    Est ce possible avec indy ?

    Merci d'avance

    Jazz

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Points : 69
    Points
    69
    Par défaut
    en cherchant, j'ai trouvé le code suivant qui envoi un message au format RTF.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    uses 
     
    procedure SendMail;
    var
      MBuilder: TIdMessageBuilderRtf;
      MyMemoryStream: TMemoryStream;
    begin
      try
        MBuilder := TIdMessageBuilderRtf.Create;
        MyMemoryStream := TMemoryStream.Create;
        MBuilder.RtfType := idMsgBldrRtfRichtext;
        // RichEdit1 has PlainText set to False
        // at design time I pasted some formatted text onto it
        RichEdit1.Lines.SaveToStream(MyMemoryStream);
        MBuilder.Rtf.LoadFromStream(MyMemoryStream);
        MBuilder.FillMessage(IdMessage1);
        IdSMTP1.Connect;
        IdSMTP1.Send(IdMessage1);
        IdSMTP1.Disconnect;
      finally
        MyMemoryStream.Free;
        MBuilder.Free;
      end;
    end;
    Le code faisant référence à l'unité IdMessageBuilder;

    Est-ce la version Indy 9 ou 10 ?
    Ou trouve t' on cette unité ?

    Merci d'avance
    Jazz

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Sous Linux, Indy fonctionne mal selon moi et la dernière release ne s'installe pas correctement ni sur Windows, ni sur Nux. Je viens d'y passer une heure... par curiosté. Si cela vous tente http://indy.fulgan.com/Getting the l...rtoise SVN.pdf. Les paquets "fulgan" ne sont pas directement exploitables par Lazarus : il m'a toujours fallu déplacer et regrouper le contenu de divers dossiers du paquet pour que cela fonctionne [http://forums2.atozed.com/search.php?keywords=lazarus].

    Il a quelques temps, j'ai effectué ces modifications sur un paquet 10.5.8.4797 qui est installable. Jamais il ne m'a posé de problème sous Win Win7 32/64 bits.... mais je me contente de smtp et ftp.

    Il s'installe également sous Linux (après une légère modification du code de idGlobal.pas). Il fonctionne pour le ftp client. Mais sous Nux (en tous cas en 64 bits), le smtp rencontre des problèmes de codage UTF8/16 ce qui fait que le source qui fonctionne sous Win ne fonctionne pas sur cet OS. Je viens de vérifier en réinstallant le paquet sur ma Squeeze 64 Lazarus 1.08...

    Enfin bref, on sent que Indy, c'est du Windows à l'origine. En plus, les problèmes se font plus nombreux en 64 bits. Toujours les origines je suppose.

    Pour rester positif, sous Windows avec Indy, il est effectivement possible d'envoyer des emails HTML incluant notamment des images. Je n'ai jamais réussi avec la 10.0.2.3... mais avec la 10.5.8.4797, je viens de tester le code ci-dessous : cela fonctionne sur une Lazarus 1.1 FPC 2.6.1 SVN 40369 - Win 64.

    Mes uses
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    uses
      Classes, SysUtils, FileUtil, IdSMTP, IdMessage, IdAntiFreeze, IdText, IdAttachment, IdAttachmentFile, Forms, Controls,
      Graphics, Dialogs, StdCtrls, IdMessageParts, IdMessageBuilder;
    [/code]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button2: TButton;
        IdAntiFreeze1: TIdAntiFreeze;
        IdMessage1: TIdMessage;
        IdSMTP1: TIdSMTP;
        procedure Button2Click(Sender: TObject);
        private
        { private declarations }
      public
        { public declarations }
      end;
    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    function GenerateCID : String;
    var
       i : smallint;
       sTmp : String;
    begin
       Randomize;
       sTmp := '';
       for i := 1 to 40 do
          sTmp := sTmp + IntToStr(Round(Random(9)));
       Result := sTmp;
    end;  
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      email: TIdMessage;
      sCid : String;
    begin
      scID := GenerateCID;
      with IdMessage1 do begin
         From.Text := 'expediteur@mail.com';
         Recipients.EMailAddresses := 'destinataire@mail.com';
         Subject := 'Hello';
         with TIdMessageBuilderHtml.Create do try
            with html do begin
               Clear;
               Add('<html>');
               Add('<head>');
               Add('</head>');
               Add('<body><h1>Hello</h1>');
               Add('<img src="cid:'+scId+'" />');
               Add('Voici une image !</body>');
               Add('</html>');
            end;
            HtmlCharSet:= 'utf-8';
            HtmlFiles.Add('monimage.jpg',scID );
            FillMessage(IdMessage1);
            try
               idSMTP1.Connect();
               try
                  idSMTP1.Send(IdMessage1);
                  ShowMessage('Envoyé');
               except
                   on E: Exception do
                      ShowMessage('Erreur : ' + E.Message);
               end;
             finally
               idSMTP1.Disconnect();
             end;
          finally
            Free;
          end;
      //  email.Free();
      end;
    end;
    Pour que cela puisse compiler :


    Cordialement. Gilles
    PS:
    1. Pour le texte enrichi donc à partir d'un RichMemo, je ne sais pas. Le RichMemo fonctionne mal lui aussi en Nux.
    2. Mon paquet "adapté" indylaz.rar fait 2630 Ko. Si vous en avez besoin...
    3. Adresse utile : http://www.indyproject.org/Sockets/B...080116.EN.aspx
    Dernière modification par Invité ; 21/05/2013 à 10h43.

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Points : 69
    Points
    69
    Par défaut
    Merci Gilles pour ta réponse.

    Mon objectif est d'envoyer un message au format RTF par email sous Windows

    J'ai vérifié le composant RichMemo et il me génère bien le document au format RTF.

    J'ai réussi cependant à envoyer un émail au format Html, cependant RichMemo ne gère pas l'HTML .

    J'ai cherché sans succès sur le net une unité qui converti le RTF en HTML.

    je ne sais pas si il existe un composant de type Richmemo qui gère le HTML.

    Votre paquet adapté indylaz.rar m'intéresse.

    mon code est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    uses
      Classes, SysUtils, FileUtil,
      SynMemo, Forms, Controls, Graphics, Dialogs, Buttons, ComCtrls, StdCtrls,
      ButtonPanel, ExtCtrls, IdSMTP, IdMessage, IdAttachmentFile, IdComponent,
      RichMemo, IdText, IdMessageBuilder;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    procedure TFormMail.btnSendClick(Sender: TObject);
    var
      // MBuilder: TIdMessageBuilderRtf;
      MyMemoryStream: TMemoryStream;
      MBuilder: TIdMessageBuilderRtf;
    begin
      try
        MyMemoryStream := TMemoryStream.Create;
     
        msg.ReceiptRecipient.Name := 'jazz';  //'<Name of recipient>'
        msg.ReceiptRecipient.Address := edFrom.Text;  // <Email address of recipient>
     
        msg.From.Name := 'jazz';                     // Nom de l'expediteur
        msg.From.Address := edFrom.Text;       // Email expediteur
        msg.Sender.Name := edTo.Text;           // Email destinataire 
        msg.BccList.Add.Address := edCC.Text; // Email en copie cachée
     
        Msg.ContentType:='multipart/mixed';
        msg.IsEncoded:=true;
        msg.CharSet:='iso-8859-1';
        msg.Encoding:=meMIME;
     
        MBuilder := TIdMessageBuilderRtf.Create;
        MBuilder.RtfType := idMsgBldrRtfRichtext;
     
        RichMemo1.SaveRichText(MyMemoryStream);
        MyMemoryStream.SaveToFile('source2.rtf');
        MyMemoryStream.Position:=0;
     
        MBuilder.Rtf.LoadFromStream(MyMemoryStream);
        MBuilder.FillMessage(msg);
     
        msg.Subject := edSujet.Text;
        smtp.Host := edSMTP.Text;   // IP Address of SMTP server
        smtp.Port := 25;        // Port address of SMTP service (usually 25)
      except
        showmessage('ca plante');
      end;
      try
        try
          smtp.ConnectTimeout := 1000;
          smtp.Connect;
          Application.ProcessMessages;
          smtp.Send(MSG);
        except
          on E: Exception do
            StatusMemo.Lines.Insert(0, 'ERREUR: ' + E.Message);
        end;
      finally
        if smtp.Connected then
           smtp.Disconnect;
        MyMemoryStream.Free;
        MBuilder.Free;
      end; 
    end;
    Coridalement
    jazz

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Désolé pour le retard,

    Donc voici le paquet :

    J'ai modifié le IdGlobal.pas comme proposé dans ce forum
    Initialement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      // LByteSize was decremented by the number of bytes stored in the output buffer
        Inc(Result, SizeOf(LBytes)-LByteSize);
        if Chars = nil then begin
          Exit;
        end;
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        {$IFDEF Windows}
        // LByteSize was decremented by the number of bytes stored in the output buffer
        Inc(Result, SizeOf(LBytes)-LByteSize);
        if Chars = nil then begin
          Exit;
        end;
        {$ENDIF}
        //Add -> http://forums2.atozed.com/viewtopic.php?f=7&t=26264&start=0
        {$IFDEF Linux}
        // LByteSize was decremented by the number of bytes stored in the output buffer
        //Inc(Result, SizeOf(LBytes)-LByteSize);
        Inc(Result, ByteCount-LByteSize);
        //Prepare for the next pass of the repeat (just in case, I think it should not do it again...)
        ByteCount:=LByteSize;
        {$ENDIF}
    et le indy.lpk pour que le paquet s'installe en une seule fois. J'ai vérifié l'installation sous Windows7 et Ubuntu 13. RAS Ce sont encore les vieilles icônes (16 couleurs)...

    Petits rappels :
    • Sous Linux, avec la version 4797, il y a un problème au niveau de l'UTF8 lors de l'utilisation de certains composants.
    • Le paquet ne s'installe pas correctement sur mon Mac OS.


    J'ai également téléchargé le dernier trunk de Indy mais là.... Je ne sais pas comment cela fonctionne en Delphi mais le genre de code suivant ne passe pas en Lazarus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Procedure machin(const aInt : integer)
    begin
      inc(aInt);
    end;
    En Lazarus, si aInt est définie comme constante, on ne peut pas l'incrémenter... Le code de idGlobal.pas du trunk contient une dizaine de ces "bizarreries"... et bloque à la compilation. C'est contournable assez facilement mais il y a d'autres problèmes signalés.

    Cordialement. Gilles
    Dernière modification par tourlourou ; 25/05/2013 à 18h48. Motif: corrections frappe

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Points : 69
    Points
    69
    Par défaut
    Merci Gilles *

    Je n'ai toujours pas réussi à envoyer un mail au format Rtf mais je continue mon investigation.

    cordialement

    Jazz

  7. #7
    Membre averti
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 156
    Points : 331
    Points
    331
    Par défaut
    Salut Jazz77,
    va faire un tour ici pour une conversion rtf vers html. Je ne sais pas si cela marche mais le code existe.

    Amicalement, nullosse

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Points : 69
    Points
    69
    Par défaut
    Merci nullosse pour l'info


    pour l'instant je focalise mon investigation sur les fonctionnalités d'Indy . Je pense qu' Indy intègre la fonction d'envoi de mail au format RTF.

    Cordialement
    Jazz

Discussions similaires

  1. [WD10]envoyer un email au format HTML
    Par kwakly dans le forum WinDev
    Réponses: 4
    Dernier message: 31/10/2007, 12h09
  2. [HTML] Email au format HTML
    Par sat478 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 09/07/2007, 11h51
  3. Sauvegarder un email en format texte (Outlook 2007)
    Par _H²O_ dans le forum Outlook
    Réponses: 7
    Dernier message: 09/05/2007, 16h06
  4. Email au format HTML via VBA
    Par DPhBxl dans le forum Access
    Réponses: 10
    Dernier message: 25/01/2007, 15h24
  5. [HTML]Email au format html
    Par willowII dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 12/03/2005, 21h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo