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

C++Builder Discussion :

Problème d'instanciation avec Indy / IMAP4


Sujet :

C++Builder

  1. #1
    Membre chevronné
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Par défaut Problème d'instanciation avec Indy / IMAP4
    Malgré des recherches sur la toile, il semble que peu de développeurs utilisent les classes VCL Internet Indy, surtout avec BCB.

    Mais peut être qu'on pourra néanmoins m'aider avec ce qui semble être un problème classique d'instanciation en C++.
    Je ne sais pas quoi indiquer comme paramètres pour les objets ci-dessous. Qui aurait une idée de ce qu'il faut faire ?




    Indy 10 avec BCB XE

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Quel est le problème ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TIdMessagePart *PJ = new TIdMessagePart(NULL);
    Si il se montre capricieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TIdMessagePart *PJ = new TIdMessagePart((TPersistent*)NULL);
    Tu dois pourvoir aussi utiliser l'instance de TIdMessage comme Owner, ainsi quand tu le libéreras, cela libérera les Parts (quoi que cela doit même se faire automatiquement puisque c'est une collection)

    En pur théorie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TIdMessageCollection *CollMess = new TIdMessageCollection(_classid(TIdMessageItem));
    Maintenant, tu pourrais utiliser un TIdMailBox
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre chevronné
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Par défaut
    Merci, ShaiLeTroll, pour cette réponse précieuse que je n'aurais jamais trouvée :
    TIdMessageCollection *ListeMessages = new TIdMessageCollection(__classid(TIdMessageItem));

    Maintenant, j'avais avancé mon affaire en positionnant la propriété IdIMAP41::RetrieveOnSelect à rsHeaders, ce qui occasionnait un temps considérable à lire les dossiers (MailBox) contenant des dizaines de messages (avec SelectMailbox)

    En utilisant, grâce à ton aide, le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TIdMessageCollection *ListeMessages = new TIdMessageCollection(__classid(TIdMessageItem));
    ...
    	if (IdIMAP41->SelectMailBox(ListBox1->Items->Strings[ListBox1->ItemIndex]))
    		if (IdIMAP41->RetrieveAllEnvelopes(ListeMessages)) [ou bien]
    		if (IdIMAP41->RetrieveAllHeaders(ListeMessages))
    int NbMsg = IdIMAP41->MailBox->MessageList->Count;
    avec RetrieveOnSelect positionné à rsDisabled,
    La valeur IdIMAP41->MailBox->MessageList->Count ne contient plus le nombre de messages du dossier comme c'est le cas avec RetrieveOnSelect à rsHeaders.

    Pour me résumer, avec RetrieveOnSelect à rsHeaders, pas besoin de RetrieveAllEnvelopes(ListeMessages) ou de RetrieveAllHeaders(ListeMessages) pour obtenir le nombre de messages du dossier, mais avec RetrieveOnSelect à rsDiasabled, rien à faire.

    Y a-t-il une solution autre pour connaître avec performance juste le nombre de messages dans la MailBox ?

    Merci d'avance.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Je ne sais pas si c'est plus performant mais tu as RecentMsgs et TotalMsgs dans TIdMailBox
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre chevronné
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Par défaut
    Oui, cela fonctionne, merci beaucoup.

    Il me reste à poursuivre mes tests sachant que je me heurte à différents problèmes comme la lecture du seul BODY sans les pièces jointes ainsi qu'à l'affichage propre du BODY (avec le bon codage de caractères).

    Y'a encore de quoi faire

  6. #6
    Membre chevronné
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Par défaut
    J'ai avancé dans mon projet mais je bloque sur la recherche de la taille de chaque pièce jointe.

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Sans code, difficile de savoir où tu en es !

    Avec RetrieveAllHeaders, tu as rempli ta ListeMessages, qui contient des TIdMessageItem, ces derniers ont chacun un membre public Msg qui pointe sur un TIdMessage !
    Le TIdMessage te fourni une propriété MessageParts contenant des TIdMessageParts que tu peux transtyper (utilise InheritsFrom ou dynamic_cast) en TIdAttachment, je pense qu'il faut que tu regardes les propriétés hérités de TIdMessagePart comme Headers (ContentDisposition) qui doit bien fournir une propriété SIZE=? (RFC 2183)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut Altau
    Peut etre quelque chose comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IdIMAP41->MailBox->TotalMsgs

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Merci Blondelle, mais Altau a dépassé le stade du comptage de message, j'avais déjà donné cette réponse "01/09/2011 15h04"

    Maintenant, son problème c'est connaître la taille de la pièce jointe sans devoir la télécharger évidemment !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut ShaiLeTroll
    Desole manque d'attention.
    Pour recuperer la longueur du texte peut etre de cette facon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int LngTxtBody = (IdMessage1->Body->Text).Length();

  11. #11
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Citation Envoyé par blondelle Voir le message
    Desole manque d'attention.
    Pour recuperer la longueur du texte ...
    Citation Envoyé par Altau Voir le message
    J'ai avancé dans mon projet mais je bloque sur la recherche de la taille de chaque pièce jointe.
    Prend un grand café noir car ce n'est toujours pas la bonne question à laquelle tu réponds !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Peut etre comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int LngMsg = (IdMessage1->MessageParts->Items[1]->ContentType).Length();

  13. #13
    Membre chevronné
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Par défaut
    J'ai un doute sur le ContentType.Length() car si je ne me trompe, ContentType contient des infos du genre "text/plain" je crois.

    J'essaie tout ça demain.

    Merci à vous deux.

  14. #14
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Je pense que tu a raison

  15. #15
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Altau, je ne sais pas si tu as vu ma réponse du "06/09/2011 09h40"

    Je pensais à quelque comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int LngMsg = IntToStr(IdMessage1->MessageParts->Items[i]->Headers->Values['Size']);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TStringList* SL = new TStringList();
    SL->Text = IdMessage1->MessageParts->Items[i]->ContentDisposition;
    int LngMsg = SL->Values['Size']);
    delete SL;
    comme on peut l'espérer selon l'aide en ligne TIdAttachment.ContentDisposition Property
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  16. #16
    Membre chevronné
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Par défaut
    Oui, ShaiLeTroll, j'ai vu mais j'ai un problème avec l'EDI à mon boulot après passage à Indy 10.5.8.
    Je revois donc tout ça ce soir chez moi sur une machine propre.

    Merci pour l'idée.

  17. #17
    Membre chevronné
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Par défaut
    Alors, le code suivant ne donne rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	MSG->MessageParts->CountParts();
    	for (int j=0 ; j < MSG->MessageParts->AttachmentCount ; j++) { // pour chaque pièce jointe
    		Piece = MSG->MessageParts->Items[j];
    		PJ = dynamic_cast<TIdAttachment *>(Piece);
    ...
    PJ = NULL.


    Et Headers->Text contient : "Content-Type: text/html\r\nContent-Transfer-Encoding: 8bit\r\n" donc pas de "size" là encore.

  18. #18
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Si le cast en TIdAttachment ne passe pas c'est que ce n'est pas une pièce jointe !
    Là vu le contenu, il est clair que c'est un TIdText !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (int j=0 ; j < MSG->MessageParts->AttachmentCount ; j++) 
    { // pour chaque partie
      Partie = MSG->MessageParts->Items[j];
      // Est-ce une pièce jointe ?
      PJ = dynamic_cast<TIdAttachment *>(Partie);
      if (PJ)
      {
         ...
      }
    }
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  19. #19
    Membre chevronné
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Par défaut
    Alors finalement, sur les conseils de Remy Lebeau de Embarcadero j'ai fini par utiliser un TIdImapMessageParts qui m'a permis d'avancer car il y a une propriété Size ici. Je suis également passé en Indy 1.5.8 qui résout certains problèmes.

    Je me retrouve à présent avec des problèmes de codage de caractères quand je fais un IdIMAP41->UIDRetrieveText(MonUid, Chaine) où soit les caractères accentués sont transformés ou supprimés
    Bonjour Altau,

    ShaiLeTroll vient de r?pondre ? une discussion ? laquelle vous ?tes abonn? :
    Forum : C++Builder (sur Forum des professionnels en informatique)
    Intitul? de la discussion : [Langage/Algorithme] Probl?me d'instanciation avec Indy / IMAP4
    soit du texte simple s'affiche avec des caractères cabalistiques comme s'il y avait un problème avec le base64
    gcXVpIGZhaXQgcGFydGllIGRlcyBk
    b21haW5lcyBxdWUg
    J'ai pas mal avancé mais il y a encore du travail. Quand mon mini client Imap tiendra un peu mieux la route, je publierai le code.

Discussions similaires

  1. [Lazarus] [Mac OS X] Problème de téléchargement HTTP avec Indy
    Par sinfoni dans le forum Lazarus
    Réponses: 0
    Dernier message: 13/04/2011, 18h34
  2. Problème de download avec Indy
    Par sinfoni dans le forum Web & réseau
    Réponses: 0
    Dernier message: 13/04/2011, 18h33
  3. Problème d'heure avec Indy v10
    Par TsCyrille dans le forum C++Builder
    Réponses: 0
    Dernier message: 20/08/2008, 17h24
  4. Problème d'accents avec Delphi 7 et Indy
    Par julesclaude dans le forum Web & réseau
    Réponses: 0
    Dernier message: 20/07/2008, 16h35
  5. Problème avec Indy sous BSD 2006
    Par merouane_k dans le forum Web & réseau
    Réponses: 1
    Dernier message: 22/03/2008, 21h35

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