begin process at 2010 03 21 01:02:26
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Composants

 > MAIL INDY10: MULTIPART/RELATED MESSAGEPARTS

MAIL INDY10: MULTIPART/RELATED MESSAGEPARTS


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Composants Classé sous :indy, mail, idmessage, Messageparts Niveau :Expert Date de création :27/02/2008 Vu :4 727

Auteur : MAURICIO

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note


 Description

Pour les 2 ou 3 personnes que ça va interesser vu le succès mondial de mes sources sur les mails avec Indy :(

90% des mails ne posent pas de problème ... Par contre, pour les autres 10% il faut s' accrocher:
- embedded images : http://www.delphifr.com/codes/MAILS-AVEC-INDY10-CO NTENTTYPE-CONTENTID-PARENTPART_45372.aspx
- des attachments qui contiennent un mail?!
etc ...

Bref, tous ces problèmes viennent souvent des mails qui sont envoyés par OutLook bien souvent à cause d' un forward d' un forward d' un forward...

Cette source vient dans l' esprit de celle-ci et est d' ailleurs reprise ici afin que celle-ci regroupe toutes les possibilités:
http://www.delphifr.com/codes/MAILS-AVEC-INDY-FAI RE-POURQUOI-LORSQUE-ANEXE-NE_44335.aspx

Le fait est que multipart/related MessageParts contiennent elles mêmes plusieurs parties de mails.
La fontion EXTRACT_MAIL_EMBEDDED_IN_TEXT(IdTexto: TIdText); permet de récupérer les parties contenues.

Je vous conseille aussi de regarder ma source:
MAILS AVEC INDY10, RÉSOLUTION DU PROBLÈME LORSQUE CHARSET = UTF-8
http://www.delphifr.com/codes/MAILS-AVEC-IND Y10-RESOLUTION-PROBLEME-LORSQUE-CHARSET-UTF_43582

Source

  • Mensagem est de type TIdMessage
  • IndMsg est l' indice du message que l' on veut récupérer
  • IdPOP31 est un compo de type TIdPOP3 qui est sur la form FrmPreview
  • IdMsg est un compo de type TIdMessage qui est sur la form FrmPreview
  • procedure PREVIEW_MAIL;
  • var
  • TOT_MSG, M: Integer;
  • _Ok: Boolean;
  • begin
  • FrmPreview := TFrmPreview.Create(nil);
  • with FrmPreview do
  • begin
  • try
  • _Ok := false;
  • RETexto.Lines.Clear; // RichEdit qui contiendra le Body du mail au format Texte
  • REHtml.Lines.Clear; // RichEdit qui contiendra le Body du mail au format Html
  • LBAnexos.Items.Clear; // ListBox avec les noms des anexes
  • IdPOP31.Host := xxx;
  • IdPOP31.Port := xxx;
  • IdPOP31.Username := xxx;
  • IdPOP31.Password := xxx;
  • IdPOP31.Connect;
  • TOT_MSG := IdPOP31.CheckMessages; // Nombre de messages
  • MemUID.Lines.Clear; // memo avec les UID, qui est une valeur unique pour chaque message
  • IdPOP31.UIDL(MemUID.Lines, -1); // Récupérer les UID des messages ...
  • IdMsg.Clear;
  • IdPOP31.Retrieve(IndMsg, IdMsg);
  • IDMESSAGE_EXTRACT_INFO(IdMsg);
  • _Ok := true;
  • finally
  • if IdPOP31.Connected
  • then IdPOP31.Disconnect; // Fermer la conexion
  • if LBAnexos.Items.Count = 0
  • then LBAnexos.Items.Add('(Aucun anexe)');
  • if _Ok
  • then Caption := ' Preview mail'
  • else Caption := ' Error Preview mail !!!';
  • ShowModal;
  • end;
  • end;
  • FrmPreview.Release;
  • end;
  • end;
  • // Fonction qui permet de récupérer le Body et les anexes :
  • procedure TFrmPreview.IDMESSAGE_EXTRACT_INFO(Mensagem: TIdMessage);
  • var
  • _a: Integer;
  • DuplicatedBody: Boolean;
  • procedure EXTRACT_MAIL_EMBEDDED_IN_TEXT(IdTexto: TIdText);
  • var
  • aTmpStream: TMemoryStream;
  • aTmpIdMsg: TIdMessage;
  • begin
  • aTmpStream := TMemoryStream.Create;
  • aTmpIdMsg := TIdMessage.Create(self);
  • try
  • IdTexto.Body.SaveToStream(aTmpStream);
  • aTmpStream.Position := 0; // Revenir au début des données du Stream ...
  • aTmpIdMsg.Clear;
  • aTmpIdMsg.LoadFromStream(aTmpStream);
  • IDMESSAGE_EXTRACT_INFO(aTmpIdMsg);
  • finally
  • FreeAndNil(aTmpStream);
  • aTmpIdMsg.Free;
  • end;
  • end;
  • procedure OPEN_MAIL_EMBEDDED_IN_ATTACHMENT(Anexo: TIdAttachment);
  • var
  • aTmpStream: TMemoryStream;
  • aTmpIdMsg: TIdMessage;
  • begin
  • aTmpStream := TMemoryStream.Create;
  • aTmpIdMsg := TIdMessage.Create(self);
  • try
  • Anexo.SaveToStream(aTmpStream);
  • aTmpStream.Position := 0; // Revenir au début des données du Stream ...
  • aTmpIdMsg.Clear;
  • aTmpIdMsg.LoadFromStream(aTmpStream);
  • IDMESSAGE_EXTRACT_INFO(aTmpIdMsg); // On rapelle la fonction pou y retirer les infos ...
  • finally
  • FreeAndNil(aTmpStream);
  • aTmpIdMsg.Free;
  • end;
  • end;
  • begin
  • DuplicatedBody := False;
  • for _a := 0 to Mensagem.MessageParts.Count - 1 do
  • begin
  • if (Mensagem.MessageParts.Items[_a] is TIdText) // Texte ...
  • then begin
  • try
  • if Mensagem.Body = TIdText(Mensagem.MessageParts.Items[_a]).Body
  • then DuplicatedBody := True;
  • if TIdText(Mensagem.MessageParts.Items[_a]).ContentType = 'multipart/related' // il y aura des parties dans cette partie de mail !
  • then begin
  • EXTRACT_MAIL_EMBEDDED_IN_TEXT(TIdText(Mensagem.MessageParts.Items[_a]));
  • end
  • else
  • if TIdText(Mensagem.MessageParts.Items[_a]).ContentType = 'text/html'
  • then REHtml.Lines.AddStrings(TIdText(Mensagem.MessageParts.Items[_a]).Body) // text/html
  • else RETexto.Lines.AddStrings(TIdText(Mensagem.MessageParts.Items[_a]).Body); // text/plain e outros ...
  • except
  • end;
  • end
  • else begin
  • if TIdAttachment(Mensagem.MessageParts.Items[_a]).FileName <> '' // Pas de nom pour l' anexe!!!
  • then begin
  • LBAnexos.Items.Add('<' + TIdAttachment(Mensagem.MessageParts.Items[_a]).FileName + '>');
  • Activez cette ligne si vous voulez faire le download de l' anexe:
  • //
  • TIdAttachment(Mensagem.MessageParts.Items[_a]).SaveToFile('c:\_output\'
  • + TIdAttachment(Mensagem.MessageParts.Items[_a]).FileName);
  • end
  • else
  • OPEN_MAIL_EMBEDDED_IN_ATTACHMENT(TIdAttachment(Mensagem.MessageParts.Items[_a]));
  • end;
  • end;
  • if Pos('This is a multi-part message in MIME format.', Mensagem.Body.Text) = 0
  • then
  • if not DuplicatedBody
  • then RETexto.Lines.AddStrings(Mensagem.Body);
  • end;
Mensagem est de type TIdMessage
IndMsg est l' indice du message que l' on veut récupérer 
IdPOP31 est un compo de type TIdPOP3 qui est sur la form FrmPreview
IdMsg est un compo de type TIdMessage qui est sur la form FrmPreview

procedure PREVIEW_MAIL;
var
  TOT_MSG, M: Integer;
  _Ok: Boolean;
begin
    FrmPreview := TFrmPreview.Create(nil);
    with FrmPreview do
    begin
      try
        _Ok := false;
        RETexto.Lines.Clear;  // RichEdit qui contiendra le Body du mail au format Texte 
        REHtml.Lines.Clear;   // RichEdit qui contiendra le Body du mail au format Html
        LBAnexos.Items.Clear; // ListBox avec les noms des anexes
        IdPOP31.Host       := xxx;
        IdPOP31.Port       := xxx;
        IdPOP31.Username   := xxx;
        IdPOP31.Password   := xxx;
        IdPOP31.Connect;
        TOT_MSG := IdPOP31.CheckMessages;  // Nombre de messages
        MemUID.Lines.Clear; // memo avec les UID, qui est une valeur unique pour chaque message
        IdPOP31.UIDL(MemUID.Lines, -1);  // Récupérer les UID des messages ...
        IdMsg.Clear;
        IdPOP31.Retrieve(IndMsg, IdMsg);
        IDMESSAGE_EXTRACT_INFO(IdMsg);
        _Ok := true;
      finally
        if IdPOP31.Connected
        then IdPOP31.Disconnect;   // Fermer la conexion 
        if LBAnexos.Items.Count = 0
        then LBAnexos.Items.Add('(Aucun anexe)');
        if _Ok
        then Caption := ' Preview mail'
        else Caption := ' Error Preview mail !!!';
        ShowModal;
      end;
    end;
    FrmPreview.Release;
  end;
end;
// Fonction qui permet de récupérer le Body et les anexes : 
procedure TFrmPreview.IDMESSAGE_EXTRACT_INFO(Mensagem: TIdMessage);
var
  _a: Integer;
  DuplicatedBody: Boolean;

      procedure EXTRACT_MAIL_EMBEDDED_IN_TEXT(IdTexto: TIdText);
      var
        aTmpStream: TMemoryStream;
        aTmpIdMsg: TIdMessage;
      begin
        aTmpStream := TMemoryStream.Create;
        aTmpIdMsg := TIdMessage.Create(self);

        try
          IdTexto.Body.SaveToStream(aTmpStream);
          aTmpStream.Position := 0;      // Revenir au début des données du Stream ...
          aTmpIdMsg.Clear;
          aTmpIdMsg.LoadFromStream(aTmpStream);
          IDMESSAGE_EXTRACT_INFO(aTmpIdMsg);
        finally
          FreeAndNil(aTmpStream);
          aTmpIdMsg.Free;
        end;
      end;

      procedure OPEN_MAIL_EMBEDDED_IN_ATTACHMENT(Anexo: TIdAttachment);
      var
        aTmpStream: TMemoryStream;
        aTmpIdMsg: TIdMessage;
      begin
        aTmpStream := TMemoryStream.Create;
        aTmpIdMsg := TIdMessage.Create(self);
        try
          Anexo.SaveToStream(aTmpStream);
          aTmpStream.Position := 0;      // Revenir au début des données du Stream ...
          aTmpIdMsg.Clear;
          aTmpIdMsg.LoadFromStream(aTmpStream);
          IDMESSAGE_EXTRACT_INFO(aTmpIdMsg);    // On rapelle la fonction pou y retirer les infos ...
        finally
          FreeAndNil(aTmpStream);
          aTmpIdMsg.Free;
        end;
      end;
begin
  DuplicatedBody := False;
  for _a := 0 to Mensagem.MessageParts.Count -  1 do
  begin
    if (Mensagem.MessageParts.Items[_a] is TIdText)        // Texte ...
    then begin
      try
        if Mensagem.Body = TIdText(Mensagem.MessageParts.Items[_a]).Body
        then DuplicatedBody := True;

        if TIdText(Mensagem.MessageParts.Items[_a]).ContentType = 'multipart/related'  // il y aura des parties dans cette partie de mail !
        then begin
          EXTRACT_MAIL_EMBEDDED_IN_TEXT(TIdText(Mensagem.MessageParts.Items[_a]));
        end
        else
          if TIdText(Mensagem.MessageParts.Items[_a]).ContentType = 'text/html'
          then REHtml.Lines.AddStrings(TIdText(Mensagem.MessageParts.Items[_a]).Body)    // text/html
          else RETexto.Lines.AddStrings(TIdText(Mensagem.MessageParts.Items[_a]).Body);  // text/plain e outros ...
      except
      end;
    end
    else begin
      if TIdAttachment(Mensagem.MessageParts.Items[_a]).FileName <> ''  // Pas de nom pour l' anexe!!!
      then begin
        LBAnexos.Items.Add('<' + TIdAttachment(Mensagem.MessageParts.Items[_a]).FileName + '>');
Activez cette ligne si vous voulez faire le download de l' anexe:
//
TIdAttachment(Mensagem.MessageParts.Items[_a]).SaveToFile('c:\_output\'
+ TIdAttachment(Mensagem.MessageParts.Items[_a]).FileName);
      end
      else
        OPEN_MAIL_EMBEDDED_IN_ATTACHMENT(TIdAttachment(Mensagem.MessageParts.Items[_a]));
    end;
  end;
  if Pos('This is a multi-part message in MIME format.', Mensagem.Body.Text) = 0
  then
    if not DuplicatedBody
    then RETexto.Lines.AddStrings(Mensagem.Body);
end;

 Conclusion

Bem c' est pas très propre comme solution mais ça a le mérite de fonctionner.
Tout le monde sait que les compos de mails Indy auraient besoin d' être complètement refaits mais y a t-il quelqu'un d' assez courageux pour le faire?
Moi? Je ne suis pas un héros ... (clin d' oeil à Daniel Balavoine sniff)


 Sources du même auteur

Source avec une capture VOTRE PROGRAMME DE MAIL COMME CLIENT MAIL PAR DÉFAUT SOUS WI...
Source avec Zip Source avec une capture DEMO DE MON COMPO TCYWEBBROWSER - VISUALISER DES PAGES HTML ...
Source avec Zip Source avec une capture COMPOS TCYCOMPONENTS V2.62
Source avec Zip Source avec une capture JETTER LES MESSAGES DANS "MESSAGE QUEUE" APRÈS UN LONG CODE
LIBRAIRIE DE FONCTIONS DE GESTION DE SOUS-CHAINES.

 Sources de la même categorie

Source avec Zip COMPOSANT THORLOGE par Michel34
Source avec Zip COMMANDS MANAGER - BESOIN DE COMMANDES DANS VOS PROGRAMMES T... par f0xi
Source avec Zip Source avec une capture COMPOSANT TZSIMAGE par ThWilliam
Source avec Zip Source avec une capture UTILISER LES COMPOSANTS PAR LEURS NUMÉROS par Dany3
Source avec Zip Source avec une capture TQGRID UN STRINGGRID AMÉLIORER. par yanb

 Sources en rapport avec celle ci

Source avec une capture VOTRE PROGRAMME DE MAIL COMME CLIENT MAIL PAR DÉFAUT SOUS WI... par MAURICIO
Source avec une capture MAILS AVEC INDY10 : QUE FAIRE LORSQUE LE CONTENU AU FORMAT M... par MAURICIO
MAILS AVEC INDY10 : CONTENTTYPE/CONTENTID/PARENTPART par MAURICIO
MAILS AVEC INDY10, RÉSOLUTION DU PROBLÈME LORSQUE CHARSET = ... par MAURICIO
Source avec Zip ENVOYER UN EMAIL ET UN FICHIER JOINT AVEC LES COMPOSANTS IND... par DelphiCool

Commentaires et avis

Commentaire de MAURICIO le 27/02/2008 18:09:04

Résumons: j' ai juste écrit la fonction "procedure EXTRACT_MAIL_EMBEDDED_IN_TEXT(IdTexto: TIdText);"
équivalente à la fonction déjà présentée "procedure OPEN_MAIL_EMBEDDED_IN_ATTACHMENT(Anexo: TIdAttachment);"
car j' ai remarqué que les MessageParts dont la propriété ContentType est "multipart/related" contiennent elles mêmes des MessageParts ...


Commentaire de craftsystem le 27/02/2008 18:15:24 10/10

Toujours a fond avec Indy sa fait sisir Mauricio

merci encore

Commentaire de MAURICIO le 27/02/2008 18:47:00

Merci, ça fait plaisir!

C' est sûr que si on cherche une solution à tous ces petits problèmes (sur google par exemple), on se  rend compte tout le monde cherche comment résoudre ces petits soucis mais que personne n' apporte de solution.

Juste pour savoir: related parts veut dire que tous les messagesParts sont liés et ne sont pas à traiter séparément.

Je vous tiens au courant si je trouve d' autres bugs d' Indy ...
A+

Commentaire de MAURICIO le 28/02/2008 14:36:20

Merci florenth
A+

Commentaire de Delphiprog le 28/02/2008 23:47:11 administrateur CS

A notre dévoué et laborieux Mauricio, moi je dis qu'il faudrait décerner une médaille. Ciel, quelle persévérance !

Un jour, tu connaitras le succès que tu mérites !
Ne désespère pas et tiens bon en attendant. On compte sur toi.

Trêve de plaisanterie, c'est vrai que tu fais un sacré boulot et que tu dois maintenant connaitre les composants Indy sur le bout des doigts. Alors, rien que pour cela, je dis bravo ;)

Commentaire de MAURICIO le 29/02/2008 10:16:03

Merci DelphiProg,

non, je ne connais pas les compos sur le bout des doigts.
Je trouve d' ailleurs qu' ils sont une source d' un savoir bien plus grand que le miens: le problème est qu' ils n' évoluent plus.
Ce que j' apporte donc se sont juste des corrections "grâce" à des problèmes concrets.

A+

Commentaire de mirage36 le 08/12/2009 14:07:33

Merci d'avance pour tes codes que je télécharge tous anfin d'espérer trouver ma solution.

Je souhaite faire afficher un mail outlook préremplit avec piéces jointe, destinataires ect... via delphi. Jusque là pas de problème.

Ce que j'arrive pas à faire c'est lui dire quelle type de formulaire je souhaite remplir et afficher (par exemple IMP.Note.testformulaire).

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Composant Indy Misc: idMessage [ par Peaches ] Bonjour, je voudrais savoir si il est possible de ne pas utiliser la ligne:idMessage.From.Text:='Utilisateur@FAI.com';lorsque l'on veut envoyer un mai Probleme d'envoi de mail avec composants indy [ par tine82 ] bonjour à tous!Je voudrai envoyer un mail dans mon appli.J'utilise les composants indy TidSMTP et TidMessageet j'ai toujours la même erreur:Erreur de Envoie e-mail avec indy [ par xt3 ] Salut tout le monde, Voil&#224; mon probl&#232;me : je souhaite envoy&#233; le contenu d'un fichier texte dans un e-mail. Je suis parvenu &#224; charg Mail avec pièce jointe - Indy 10 [ par eldred ] Bonjour, je voudrais envoyer un mail avec une pièce jointe avec Indy 10 et delphi 2005. J'aimerais le faire sous delphi 6 et Indy 8 ou 9 mais delphi 6 Server mail indy [ par 365tib ] Vous n'auriez pas une idée de comment créer puis de faire fonctionner un server mail indy???Merci d'avance,365tib Indy - mails [ par nidhal77 ] je n'arrive pas à utiliser les composants Indy pour l'envoi ni la reception des mails. j'utilise le composant TidsmTP pour l'envoi et le composant Tid Mail via Indy - Obtenir heue envoi message de l'expediteur [ par vieuxpere ] Bonjour,J'ai une application qui fait office de client mail, elle permet en outre d'envoyer des messages et de réceptionner ceux qui arrivent, ceci a Indy TIdPOP3 corp du mail [ par sabrinach ] Je cherche a récupérer le copr d'un mail a l'aide du composant TIdPOP3 de Indy mais cela ne fonctionne pas correctement... Les pieces jointes sont bie Mail Composants indy [ par Hardouz ] bonjour j'ai ecri un code qui envoi un mail ac les composants indy mais il me tjr erreur time out voici mon code :procedure TForm1.Button1Click(Sender Envoi Mail avec Indy : Content-description [ par bib34690 ] Bonjour,J'utilise Indy pour envoyer des mails.Je ne trouve pas la propriété "Content-description", alors que je dois absolument la remplir.qq peut m'a


Nos sponsors


Sondage...

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales