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

Algorithmes et structures de données Discussion :

Detection de pièce jointe


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut Detection de pièce jointe
    Bonjour

    Je voudrai savoir a votre avis quel serait l'algo le plus efficace pour savoir si un mail contient une pièce jointe ou non.

    Pour le moment je decoupe le mail (l'entete + le corp) ligne par ligne. Chaque ligne est alors stockée dans un tableau.
    Je fais une boucle qui parcour ce tableau
    - si la ligne = "Content-Type: multipart/mixed;" il y a une pièce jointe et on arète le parcour
    - sinon on continue
    jusqu'à la fin du tableau.

    On pourait optimiser en stopant la boucle dès que l'on est sur que l'on a pas de pièce jointe mais je ne suis pas sur que tous les client de messagerie génère la même entète.

    Vous en pensez quoi?

    Merci

  2. #2
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    suivant les langages, tu as :

    les regex (lent)

    ou des fonction qui extrainet une sous chaine d'une chaine...
    c'est ptet plus rapide?

  3. #3
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Les regexs sont très rapides ! (même si une regex mal écrite peut-être assez lente à échouer)

    Le plus rapide dans ton cas est néanmoins de lire jusqu'à la fin de l'entête, puis de chercher "multipart/mixed" dans cet entête. (nul besoin de lire ligne à ligne ou quoi que ce soit...) avec une fonction de recherche de sous-chaîne (dont on espère qu'elle implémentera un algo rapide).

    --
    Jedaï

  4. #4
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par Jedai
    Les regexs sont très rapides ! (même si une regex mal écrite peut-être assez lente à échouer)

    --
    Jedaï
    t'en est sur? j'ai toujours lut quel es regex etaint plus lent (bcp plus lent) mais bon, je veint du phph, c'est ptet pas aussi optimisé...

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Les regexs sont implémentées sous forme d'automates, donc si elles sont bien écrites (s'il n'y a pas trop de backtrack), la complexité d'un match est de l'ordre du O(n) (n étant la longueur du texte), comme les meilleurs algorithmes de recherche de sous-chaîne (bien que Boyer-Moore puisse atteindre du O(n/m) dans le meilleur des cas, mais cela reste peu important vu que la plupart du temps : m << n). Parfois il est impossible d'éviter quelques backtracks, mais si l'expression est bien écrite, la présence des backtracks implique que la regex est complexe et doit en faire "beaucoup plus" qu'une simple recherche de sous-chaîne.
    Les regexs sont donc en réalité très efficientes, bien qu'il faille leur préférer une recherche de sous-chaîne lorsque celle-ci est constante.

    Le problème le plus souvent rencontré est que les regexs écrites par un débutant backtrackent énormément inutilement alors qu'elles auraient dû échouer très vite... Un bon livre sur le sujet est Maîtrise des expressions régulières de Friedl.

    --
    Jedaï

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    Je viens de penser a un truc, en cherchant la sous-chaine sa marche mais il y a un cas ou sa merde, si un gus envoi un mail contenant dans le corp : "Content-Type: multipart/mixed;"

    Dans ce cas la le serveur va croire que le mail comporte une pièce jointe alors que non

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Relis mon message : tu ne cherches que dans l'entête, d'ailleurs tu n'as même pas besoin de lire le corps. (en quel langage codes-tu cela : à ce stade c'est plus une question d'emploi des fonctions d'IO du langage)

    --
    Jedaï

  8. #8
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    Si je ne me trompe, si on ouvre un texte avec le bloc notes, on a des infos(l'expéditeur, l'heure d'envoi, le sujet, etc)...

    Donc ce que tu peux essayer c'est d'utiliser les entrées et sorties pour lire les infos du fichier et voir si il n'y a pas une info conscernant une EVENTUELLE pièce jointe...

    Bonne année

  9. #9
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    C'est exactement sa.

    Je programme le serveur en python en utilisant la librairie smtpd.py, il me recupère le mail entete+ corp dans une variable donc je n'ai pas de seulement l'entète ou seulement le corp c'est sa le prob.

  10. #10
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    Sauvegarde un e-mail, sélectionne-le et ouvre le avec le bloc note...
    Vois-tu ce qui s'affiche? Tu as toutes les infos nécessaires (date, expéditeur, pièce jointe)...

    Il te suffit ensuite de trouver un moyen d'utiliser les entrée/sorties pour extraire ce texte... Ensuite tu écris un mini-algo qui regarde si une inscription genre "Pièce Jointe: " est affichée dans ce que tu viens d'extraire...


    Si cette inscription apparaît, renvoie true, sinon false et prépare une solution pour caque cas...

    Je suis désolé si c'est pas très clair...

  11. #11
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    c'est comme sa que je fais, je detecte la chaine "Content-Type: multipart/mixed;" le prob maintenant c'est le cas tordu ou dans le message le gus a tapé cette chaine, mon prog va dire qu'il y a une piece jointe alors que non

  12. #12
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    Désolé, j'ai de la peine!!
    Ce que tu peux voir c'est si "Content-Type: multipart/mixed;" arrive juste après "Subject:". Si c'est le cas, c'est qu'il y a une pièce jointe.

    Autre soluce: si notre famuex mot se trouve après "Content-Transfer-Encoding:", ce n'est pas une pièce jointe...
    J'espère que ça t'avance

    Malheureusement le python c'est pas mon fort

  13. #13
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    en fait le prob c'est que j'étais pas sur que tous les webmail forme l'entète dans le meme ordre, donc verifier le truc qui vient juste avant je pensais que c'était pas sufisant. Avec outlook j'ai la mine version avant l'info sur la présence de pièce jointe.

    T'as deuxième solution me parait corecte

  14. #14
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    Programamnt en C++ je me suis tourné vers ça:
    http://www.cplusplus.com/ref/iostream/

    par contre j'ai aucune idée sur le nom de ces fonctions en Python... va poser la question sur le forum python...

    Bonne soirée

    PS: j'utilise Tunderbird et mes infos semblent se trouver dans le même ordre que les tiennes

  15. #15
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    Merci pour ton aide, je vais me remettre au boulot

  16. #16
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Je ne sais pas sous quel format tu as ton message, mais s'il est en texte pur, il te suffit de chercher "\n\n" qui signale la fin de l'entête, ensuite tu regarde si l'index de "multipart/mixed" est entre -1 et l'index de "\n\n", et ainsi tu sauras à coup sûr si il y a une pièce jointe.
    Maintenant je suis certain qu'il y a d'excellent modules en Python qui font tout ce boulot et bien plus, pourquoi ne pas les utiliser ? Les performances sont critiques ?

    --
    Jedaï

  17. #17
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    Simplement car je ne les connais pas, je vais chercher de ce coté aussi alors

Discussions similaires

  1. [Indy] Comment récupérer les pièces jointes d'un mail ?
    Par dj_lil dans le forum Web & réseau
    Réponses: 6
    Dernier message: 01/04/2011, 19h07
  2. Pièces jointes et Outlook 2000
    Par Nico118 dans le forum Outlook
    Réponses: 15
    Dernier message: 13/01/2011, 17h19
  3. [javamail] envoi mail avec message en pièce jointe
    Par k4eve dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 16/11/2007, 11h17
  4. Envoi d'un mail avec fichier en pièce jointe
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 14/06/2005, 16h30
  5. affichage des pièces jointe sous outllook 2000
    Par darkbm dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 29/10/2003, 11h32

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