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 Discussion :

Client POP3 en C - Recherche dans une chaine


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Client POP3 en C - Recherche dans une chaine
    Bonjour,
    Je suis actuellement en train de coder un client POP3 en C et je me permets de poser cette question car je suis un peu bloquée.
    En effet, je voudrais récuperer l'expéditeur et le sujet de chaque mail en utilisant la commande RETR, la commande TOP de la RFC étant optionnelle.
    Simplement, je ne vois pas vraiment comment extraire ces deux champs de mon message. Sscanf ne peut pas marcher, et étant débutante en C je ne vois pas trop koi utiliser à la place...
    J'attends votre aide,
    Merci beaucoup
    Titelily Smile

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Client POP3 en C - Recherche dans une chaine
    Citation Envoyé par titelily
    Simplement, je ne vois pas vraiment comment extraire ces deux champs de mon message. Sscanf ne peut pas marcher, et étant débutante en C je ne vois pas trop koi utiliser à la place...
    Donne un exemple de ligne à analyser et de données extraites[1].
    Explique pourquoi sscanf() ne peut pas fonctionner.

    --------------------------
    [1] Ici, on parle 'langage', pas 'application'. POP3, je ne veux pas savoir ce que c'est.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Pour info, POP3 n'est pas une application, c'est juste le protocole utilisé pour récupérer les mails...
    En fait, ce que je dois faire, c'est qu'à l'aide d'une commande, je dois extraire deux informations de ce que je récupère, et je ne vois pas trop comment extraire cette info, sachant que ce que l'on récupère n'est pas toujours formaté de la sorte. J'ai simplement 2 mots comme point de repère: From: et Subject: .
    Voici un exemple de ce que j'obtiens et dans lequel je dois faire ma recherche:
    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
    +OK 391 octets
    Return-Path: griselda
    Received: (from griselda@localhost)
            by arjuna.mindflip.com (8.9.3/8.9.3) id DAA84577
            for matthew; Tue, 12 Oct 1999 03:19:21 GMT
            (envelope-from griselda)
    Date: Tue, 12 Oct 1999 03:19:21 GMT
    From: Test User 
    Message-Id: <199910120319.DAA84577@arjuna.mindflip.com>
    To: matthew
    Subject: Test
    X-UIDL: 858de06153a9e0e3c235a4a54c4f56d3
    Status: RO
     
    This is a test.
    .
    En espérant etre plus claire.
    Merci,
    Titelily

  4. #4
    Membre actif Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Points : 207
    Points
    207
    Par défaut
    Ce que voulait dire Emmanuel, je pense, c'est que peu importe que tu utilises ton programme pour analyser du pop3 ou n'importe quelle autre donnée.
    En effet, ton problème et la nature des chaînes à analyser sont indépendants.

    Montre plutôt la façon dont tu utilises sscanf(), ce sera beaucoup plus simple de t'aider à partir de là.
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Etant donné que le texte que je récupère n'est pas formaté, je ne peux pas utiliser sscanf... C'est pour ca que je me tourne vers vous afin de trouver une autre méthode...
    Merci,
    Titelily

  6. #6
    Membre actif Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par titelily
    Etant donné que le texte que je récupère n'est pas formaté, je ne peux pas utiliser sscanf... C'est pour ca que je me tourne vers vous afin de trouver une autre méthode...
    Merci,
    Titelily
    Il me semble qu'il y a un moyen sympathique de faire ça à coup de sscanf, mais personnellement je ne me suis pas encore suffisament penché sur ces fonctions pour les utiliser (les fonctions ...scanf() ne sont pas triviales).

    Dans ton cas, deux questions s'imposent :
    - Comment sont stockées tes chaînes ? (tout est mis bout à bout ? un tableau de chaînes ? une liste chaînée ?)
    - A partir de là, adapter une solution à base de strstr() pour chercher l'identifiant de la donnée, puis avec le résultat lire la donnée jusqu'au prochain séparateur ('\n' on dirait)
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut
    Je n'ai pas tout lu
    Si ce que tu récupères est du texte, organisé en lignes se terminant par des '\n', c'est assez simple :
    tu fais une recherche de "From:" avec strstr, et ensuite tu lis la suite jusqu'au prochain '\n'.
    Idem avec "Subject:"
    Voili voilà.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par titelily
    J'ai simplement 2 mots comme point de repère: From: et Subject: .
    Voici un exemple de ce que j'obtiens et dans lequel je dois faire ma recherche:
    +OK 391 octets
    Return-Path: griselda
    Received: (from griselda@localhost)
    by arjuna.mindflip.com (8.9.3/8.9.3) id DAA84577
    for matthew; Tue, 12 Oct 1999 03:19:21 GMT
    (envelope-from griselda)
    Date: Tue, 12 Oct 1999 03:19:21 GMT
    From: Test User
    Message-Id: <199910120319.DAA84577@arjuna.mindflip.com>
    To: matthew
    Subject: Test
    X-UIDL: 858de06153a9e0e3c235a4a54c4f56d3
    Status: RO

    This is a test.

    .
    Lire chaque ligne avec fgets(). A chaque ligne, avec strstr() tu peux déterminer si un mot est dans une phrase. Ensuite, tu extrais (strcpy(), strncat()...) ce que tu veux. C'est assez simple. Fait de ton mieux et poste le code qui pose problème.
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    OK.
    Merci pour les infos, je vais tester ca.

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    En général, on résoud ce genre de problème avec un analyseur lexical, qui serait d'ailleurs très simple (la RFC POP3 n'est pas franchement complexe)...

    En gros : tu veux récupérer la "valeur" après un marqueur. On va donc prototyper ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* GetTokenValue ( char* POP3Line, char* Token ) {
    On considère que cette fonction va renvoyer NULL si la ligne POP3 ne contient pas le marqueur (token), sinon elle renverra la valeur (=suite de la ligne).

    Tu lis ton flux POP3 ligne par ligne, et tu cherches les marqueurs qui t'intéressent ("From:", par exemple) avec une instruction du genre "strstr" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      char* tmp = strstr(POP3Line,Token);
    On vérifie tout de suite le cas "pas trouvé" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if (!tmp)
        return NULL ;
    Ensuite, tu prends la fin de la ligne après le marqueur :Une opération de type "Trim" serait un plus non négligeable : d'abord à gauche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      while (((*tmp)<' ') && (*tmp))
        tmp++ ;
    Puis à droite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      int i ;
      for (i=strlen(tmp);(i>=0) &&((*tmp)<' ');i--) ;
      tmp[i]=0;
    Il ne reste plus qu'à renvoyer la "valeur" :Ce genre de fonction de recherche "détruit" la ligne originale, mais ne modifie pas la taille allouée : attention donc aux fuites mémoire !

    Il manque des trucs (ignorer la casse des tokens, NULLité de Token/POP3Line, duplication "propre" de la valeur résultat, ne pas détruire la ligne POP3 pendant l'analyse, gérer le multiligne, etc...), mais je pense que tu sauras le faire, non ? L'idée est là, en tout cas.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  11. #11
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut Re: Client POP3 en C - Recherche dans une chaine
    Citation Envoyé par titelily
    Sscanf ne peut pas marcher, et étant débutante en C je ne vois pas trop koi utiliser à la place...
    et
    Etant donné que le texte que je récupère n'est pas formaté, je ne peux pas utiliser sscanf... C'est pour ca que je me tourne vers vous afin de trouver une autre méthode...
    Mouais, sscanf fonctionne très bien...
    Regarde :
    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
     
    #include <stdio.h>
     
    #define TAILLE 80
    #define S_TAILLE "80"
     
    int main(void){
     
      FILE *f;
      char tab[TAILLE] = {0};
      char res[TAILLE] = {0};
      const char *file = "test.txt";
     
      f = fopen(file, "r");
      if (!f){
        exit(1);
      }
     
      while (fgets(tab, sizeof tab, f)) {
        if (sscanf(tab, "From:%"S_TAILLE"[^\n]", res) > 0){
          printf("expediteur : %s\n", res);
        }else if (sscanf(tab, "Subject:%"S_TAILLE"[^\n]", res) > 0){
          printf("sujet : %s\n", res);
        }
      }
     
      fclose(f);
     
      return 0;
    }
    J'ai pris ton fichier de test en exemple, et ca donne :
    $ ./a.out
    expediteur : Test User
    sujet : Test
    C'est pas ce que tu veux ?
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Oui, ca me va.
    Merci beaucoup, je vais me débrouiller avec ca.
    Merci à tous pour votre aide

  13. #13
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 93
    Points : 73
    Points
    73
    Par défaut Re: Client POP3 en C - Recherche dans une chaine
    Citation Envoyé par ?
    Il manque des trucs (ignorer la casse des tokens, NULLité de Token/POP3Line, duplication "propre" de la valeur résultat, ne pas détruire la ligne POP3 pendant l'analyse, gérer le multiligne, etc...), mais je pense que tu sauras le faire, non ?
    Moi non j'ai rien compris ... à tous mais surtout au dernière ligne ! LOL!


    Citation Envoyé par Pouic
    Citation Envoyé par titelily
    Sscanf ne peut pas marcher, et étant débutante en C je ne vois pas trop koi utiliser à la place...
    et
    Etant donné que le texte que je récupère n'est pas formaté, je ne peux pas utiliser sscanf... C'est pour ca que je me tourne vers vous afin de trouver une autre méthode...
    Mouais, sscanf fonctionne très bien...
    Regarde :
    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
     
    #include <stdio.h>
     
    #define TAILLE 80
    #define S_TAILLE "80"
     
    int main(void){
     
      FILE *f;
      char tab[TAILLE] = {0};
      char res[TAILLE] = {0};
      const char *file = "test.txt";
     
      f = fopen(file, "r");
      if (!f){
        exit(1);
      }
     
      while (fgets(tab, sizeof tab, f)) {
        if (sscanf(tab, "From:%"S_TAILLE"[^\n]", res) > 0){
          printf("expediteur : %s\n", res);
        }else if (sscanf(tab, "Subject:%"S_TAILLE"[^\n]", res) > 0){
          printf("sujet : %s\n", res);
        }
      }
     
      fclose(f);
     
      return 0;
    }
    J'ai pris ton fichier de test en exemple, et ca donne :
    $ ./a.out
    expediteur : Test User
    sujet : Test
    C'est pas ce que tu veux ?
    si ça te dérange pas pourrait tu m'expliquer ton code ?

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Sql Server] Fonction de recherche dans une chaine
    Par pierre031183 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/01/2011, 16h16
  2. recherche dans une chaine complexe
    Par PAYASS59 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 25/09/2007, 11h55
  3. Recherche dans une chaine de caractères
    Par stepd dans le forum C
    Réponses: 4
    Dernier message: 19/07/2006, 18h55
  4. Recherche dans une chaine de caractere
    Par sam.fet dans le forum Linux
    Réponses: 5
    Dernier message: 15/05/2006, 18h08
  5. [VB.NET] Recherche dans une chaine de caractères
    Par Pleymo dans le forum Windows Forms
    Réponses: 12
    Dernier message: 09/04/2005, 10h25

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