begin process at 2010 02 10 03:42:44
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Composants

 > MAILS AVEC INDY:QUE FAIRE (ET POURQUOI) LORSQUE L' ANEXE NE SEMBLE PAS AVOIR DE NOM (FILENAME='')

MAILS AVEC INDY:QUE FAIRE (ET POURQUOI) LORSQUE L' ANEXE NE SEMBLE PAS AVOIR DE NOM (FILENAME='')


 Information sur la source

Note :
Aucune note
Catégorie :Composants Classé sous :indy, anexe, attachment, filename, messagepart Niveau :Initié Date de création :09/10/2007 Date de mise à jour :10/03/2008 15:01:51 Vu / téléchargé :3 312 / 161

Auteur : MAURICIO

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


 Description

Bonjour à tous!!!
ok, ça fait longtemps que je ne participe pas mais je vous apporte aujourd' hui une solution à un problème qui ne survient pas souvent.
Il arrive que lorsque l' on veut récupérer le nom de fichier d' un fichier anexé (par la propriété filename), celui-ci est une chaine vide.

Pourquoi?
---------
Je vous ai mis dans le fichier zip un exemple d' un mail que j' ai reçut (je l' ai réduit car les données des anexes etaient grands):
IdMessage.txt contient toute l' info sur le mail reçut (Body+anexes)
Les deux premiers "Messageparts" contiennent le body en format Html/texte
Le message possède 4 anexes dont les données sont dans les fichiers suivants :
ATTACHMENT NR 3.TXT est le contenu d' un anexe dont filename est vide.
ATTACHMENT NR 4.TXT est le contenu d' un anexe dont filename est vide.
ATTACHMENT NR 5.TXT est le contenu d' un anexe dont filename est vide.
ATTACHMENT NR 6.TXT est le contenu d' un anexe dont filename est vide.
Ces 4 anexes sont donc dans le mail donné ici dans IdMessage.txt ...

Comme on peut le voir dans ces 4 fichiers, ces 4 "Messageparts" contiennent ... (roulement de tambour) ... chacun toute l' information d' un mail (body et anexe(s) compris), allez savoir pourquoi!
Ce que je peux vous dire c' est que le mail futr envoyé via Outlook.
Je vous montre alors comment récupérer l' info de ces 4 "Messageparts" de type TidAttachment (TidAttachment=anexe) qui sont eux memes des anexes au mail principal, Body + possibles anexes cette fois sans toucher aux compos Indy.
Le truc est de créer TIdMessage dynamiquement et de lui attribuer le contenu de chaque "Messagepart" du mail principal afin que le compo crée dynamiquement puisse extraire le body+anexes!

------------------------------------ --------------------------
Je vous conseille aussi de regarder ma dernière 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

  • 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 := ' Previsualizar mail'
  • else Caption := ' Erro ao tentar Previsualizar 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;
  • aFileName: String;
  • 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 doné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) // Texto ...
  • then begin
  • try
  • if Mensagem.Body = TIdText(Mensagem.MessageParts.Items[_a]).Body
  • then DuplicatedBody := True;
  • 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
  • aFileName := GetAttachmentFilename(TIdAttachment(Mensagem.MessageParts.Items[_a]));
  • if aFileName <> '' // Pas de nom pour l' anexe?
  • then begin
  • LBAnexos.Items.Add('<' + aFileName + '>');
  • Activez cette ligne si vous voulez faire le download de l' anexe:
  • // TIdAttachment(Mensagem.MessageParts.Items[_a]).SaveToFile('c:\_output\' + aFileName);
  • 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;
  • // Quelques fois il y pas de nom pour les images visuzlisées dans le mail
  • // alors on donne le nom que l' on veut :
  • function GetAttachmentFilename(aAttachment: TIdAttachment): String;
  • begin
  • RESULT := aAttachment.FileName;
  • if RESULT = ''
  • then
  • // Ver se é uma imagem com "cid" mas sem nome para o ficheiro :
  • if Pos('image', LowerCase(aAttachment.ContentType)) > 0
  • then begin
  • RESULT := 'noname';
  • if Pos('jpeg', LowerCase(aAttachment.ContentType)) > 0
  • then RESULT := RESULT + '.jpg';
  • if Pos('jpg', LowerCase(aAttachment.ContentType)) > 0
  • then RESULT := RESULT + '.jpg';
  • if Pos('gif', LowerCase(aAttachment.ContentType)) > 0
  • then RESULT := RESULT + '.gif';
  • end;
  • end;
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 := ' Previsualizar mail'
        else Caption := ' Erro ao tentar Previsualizar 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;
  aFileName: String;

      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 doné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)        // Texto ...
    then begin
      try
        if Mensagem.Body = TIdText(Mensagem.MessageParts.Items[_a]).Body
        then DuplicatedBody := True;

        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
      aFileName := GetAttachmentFilename(TIdAttachment(Mensagem.MessageParts.Items[_a]));

      if aFileName <> ''  // Pas de nom pour l' anexe?
      then begin
        LBAnexos.Items.Add('<' + aFileName + '>');
Activez cette ligne si vous voulez faire le download de l' anexe:
//        TIdAttachment(Mensagem.MessageParts.Items[_a]).SaveToFile('c:\_output\' + aFileName);
      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;

// Quelques fois il y pas de nom pour les images visuzlisées dans le mail 
// alors on donne le nom que l' on veut :
function GetAttachmentFilename(aAttachment: TIdAttachment): String;
begin
  RESULT := aAttachment.FileName;

  if RESULT = ''
  then
    // Ver se é uma imagem com "cid" mas sem nome para o ficheiro :
    if Pos('image', LowerCase(aAttachment.ContentType)) > 0
    then begin
      RESULT := 'noname';

      if Pos('jpeg', LowerCase(aAttachment.ContentType)) > 0
      then RESULT := RESULT + '.jpg';

      if Pos('jpg', LowerCase(aAttachment.ContentType)) > 0
      then RESULT := RESULT + '.jpg';

      if Pos('gif', LowerCase(aAttachment.ContentType)) > 0
      then RESULT := RESULT + '.gif';
    end;
end;

 Conclusion

Les compos Indy ont besoin de pas mal d' amélioration (et de simplification) mais ils ont au moins le mérite d' exister et d' être gratuits !!!

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

10 mars 2008 15:01:52 :
Quelques fois il y pas de nom pour les images visualisées dans le mail. Alors on détecte et on donne le nom que l' on veut!

 Sources du même auteur

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.6
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.
Source avec une capture MAILS AVEC INDY10 : QUE FAIRE LORSQUE LE CONTENU AU FORMAT M...

 Sources de la même categorie

Source avec Zip Source avec une capture TQGRID UN STRINGGRID AMÉLIORER. par yanb
Source avec Zip DYNAMIC LIBRARY LOADER CLASS: GAGNEZ DU TEMPS POUR CHARGER L... par f0xi
Source avec Zip Source avec une capture COMPOSANTS NDSOFT par diglas
Source avec Zip Source avec une capture GESTION DES "CRASHS D'APPLICATION" par Bacterius
Source avec Zip COMPOSANT TTHRESCOLLECTION par ThWilliam

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture LOGICIEL INTERRUPTEUR MONDIAL USB par ced55957
Source avec Zip Source avec une capture PARSER D'EN-TÊTE HTTP par ILP
Source avec Zip Source avec une capture DOWNLOADS HTTP EN MULTITHREAD AVEC INDY par JeremyLecouvert
Source avec une capture MAILS AVEC INDY10 : QUE FAIRE LORSQUE LE CONTENU AU FORMAT M... par MAURICIO
Source avec Zip Source avec une capture LISTE RÉCURSIVE D'UN SERVEUR FTP par John Dogget

Commentaires et avis

Commentaire de MAURICIO le 10/03/2008 15:04:48

Quelques fois il y pas de nom pour les images visualisées dans le mail
alors on donne le nom que l' on veut avec :

function GetAttachmentFilename(aAttachment: TIdAttachment): String;

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Code pas fiable dans un livre [:(!] [ par Youyou0214 ] Voil j'ai achet un livre sur delphi et je fais leurs exercises. Tout march pars un lanceur D'application. Il est compos d'une comboBox ( nom (c le n indy idFTP [ par Cyberdump ] Salut,J'ai fait un petit logiciel de tranfert FTP. J'ai fait un sorte qu'il m'indique la progression du transfert à l'aide d'une progressebar, et de p Idtelnet (composant Indy) [ par DarkLago ] Y a t'il quelqu'un qui aurait déjà réaliser une petite application telnet avec le composant IdTelnet dans delphi 6. Si oui un petit code source serait indy [ par melg ] Pourrais-tu m'expliquer comment installer les composant indy en c++builder. merci Multi-Threading Composants INDY [ par unifox ] Voilà, je scanne l'existence ou non de serveurs FTP sur des IP locales connues en tentant une connexion avec un composant IndyFTP: si ça marche je me PB lecture et enregistrement d'image [ par trollnumber1 ] TrollBonjours,Jai un probleme quand je load mes images l'image n'apparait pas mes les hints s'affiche et je ne suis plus capable de faire du glisser d source chat indy [ par SpitFire91 ] salut !je voudrais savoir si kelkun aurait des sources d'un chat utiisant les composants indy 9 de delphi ?!j'ai un reseau a créer, j'aimerais utilise classe indy client / serveur [ par norton ] hello, n'ayant pas la classe TNMUdp je voulais continuer mon prog de jestion de CyberSalle avec le composant indy mais j'aimerai faire ce code en comp Erreurs de Indy idHTTP + debugger [ par fabiin ] Salut,j'utilise le composantIndy idHttpet souvent il arrive ke l'erreur 404 arrive ou autresmon code gère par "try...except...end;" ces erreurs...Or k Problème d'installation du paquet indy [ par Youyou0214 ] Huhu tout le monde Je viens de télécharger la librairie Indy 9.0.11. je n'arrive pas a l'insaller: je l'ai mis dans un repertoire quelquonque, j'ai e


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

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,686 sec (3)

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