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 :

Protocole POP3 - lister ses mails - récupérer une piece jointe


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Dév
    Inscrit en
    Mai 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Mai 2011
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Protocole POP3 - lister ses mails - récupérer une piece jointe
    Cher communauté developpez.net,

    Dans le cadre de mon stage, j'ai à développer un (petit) client de messagerie pour récupérer des mails (et plus particulièrement la piece jointe d'un mail) qu'il faudra que je couple avec le reste de mon application.

    Bien entendu, la solution de facilité serait de manipuler Outlook, cependant j'ai commencé à programmer mon application pour qu'elle soit la plus générique et portable possible, ça m'embêterait d'être contraint à utiliser Outlook (qui dès lors devra être installé sur la machine cliente).

    Je me suis donc renseigné sur le protocole POP3. Voici les quelques lignes que j'ai codé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                TcpClient client = new TcpClient("pop.gmail.com", 995);
                NetworkStream stream = client.GetStream();
     
                Byte[] data = System.Text.Encoding.ASCII.GetBytes("USER ********@gmail.com");
                stream.Write(data, 0, data.Length);
     
                data = System.Text.Encoding.ASCII.GetBytes("PASS ************");
                stream.Write(data, 0, data.Length);
     
                Byte[] data = System.Text.Encoding.ASCII.GetBytes("LIST");
                stream.Write(data, 0, data.Length);
    Le programme ne dépasse pas la 1ere instruction. Une exception (socket exception ) est levé à la lecture de pop.gmail.com avec en détail d'exception : Hôte inconnu...



    Dans un premier temps, j'aimerais savoir si je suis bien parti (utiliser des sockets en implémentant le protocole POP3 décrit dans les RFC, tout ça tout ça), ou si je me plante complètement (ou qu'il y a un moyen plus simple / rapide)...

    Est-ce qu'il y a un quelconque moyen de lancer une sorte de "telnet" facilement en C# ?

    Ensuite, est-ce que je me suis planté d'hôte ou est-ce que l'hôte est correcte mais que le proxy de l'entreprise bloque la connexion ?


    Je vous remercie par avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Sambotte Voir le message
    Le programme ne dépasse pas la 1ere instruction. Une exception (socket exception ) est levé à la lecture de pop.gmail.com avec en détail d'exception : Hôte inconnu...
    Bizarre, pourtant l'adresse est bonne, et ça fonctionne bien pour moi (du moins les 2 premières instructions)...

    Citation Envoyé par Sambotte Voir le message
    Ensuite, est-ce que je me suis planté d'hôte ou est-ce que l'hôte est correcte mais que le proxy de l'entreprise bloque la connexion ?
    Oui, ça doit être quelque chose comme ça. Essaie avec un autre serveur POP.

    Citation Envoyé par Sambotte Voir le message
    Dans un premier temps, j'aimerais savoir si je suis bien parti (utiliser des sockets en implémentant le protocole POP3 décrit dans les RFC, tout ça tout ça), ou si je me plante complètement (ou qu'il y a un moyen plus simple / rapide)...
    Le plus simple serait d'utiliser une librairie toute faite, mais la plupart sont payantes... vois avec ton entreprise si elle est prête à payer pour ça. Cela dit, comme le protocole est assez simple, l'implémenter soi-même avec les sockets est une solution raisonnable. Par contre, plutôt que de tout réinventer, regarde si tu ne peux pas utiliser le code de ce tuto. Pour la réception des pièces jointes, c'est un peu plus complexe par contre...

    Sinon, tu utilises le port 995, mais ce port est fait pour une connexion sécurisée avec SSL. Il me semble que Gmail ne propose pas de connexion non sécurisée (habituellement sur le port 110)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Dév
    Inscrit en
    Mai 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Mai 2011
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci à toi pour tes réponses et pour le temps que tu veux bien m'accorder.

    Pour les librairies payantes, j'ose même pas demander ^^
    Si les deux premières lignes passent chez toi, mais pas dans mon entreprise, alors le proxy est fortement mis en cause, tu ne crois pas ?

    J'essaierais chez moi voir ce que ça donne... Si c'est le cas, ça va poser un certain nombre de problèmes !

    Pour les Pièces Jointes, à priori mon maitre de stage à un bout de code pour les récupérer (qu'il ne m'a pour le moment pas présenté... donc aucun moyen de voir ce que son bout de code vaut).

    Je prends bonne note pour le port. En tout cas pour le moment, même en mettant 110, ça ne passe pas ^^

    Bref, je test ça chez moi ce soir, et je viendrais alimenter ce topic pour que vous sachiez ce qu'il en est.

    En tout cas, merci encore une fois

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Sambotte Voir le message
    Pour les librairies payantes, j'ose même pas demander ^^
    Bah si c'est un truc dont l'entreprise a besoin, elle est-peut-être prête à y mettre un peu d'argent... mais apparemment il y en a aussi des gratuites qui sont correctes, il y en a quelques unes listées ici :

    http://stackoverflow.com/questions/2...-c-application

    Citation Envoyé par Sambotte Voir le message
    Si les deux premières lignes passent chez toi, mais pas dans mon entreprise, alors le proxy est fortement mis en cause, tu ne crois pas ?
    Oui, probablement

    Citation Envoyé par Sambotte Voir le message
    Je prends bonne note pour le port. En tout cas pour le moment, même en mettant 110, ça ne passe pas ^^
    Non, puisque comme je le disais Gmail ne supporte pas les connexions non sécurisées..


    J'ai un peu regardé comment ça fonctionne, en fait c'est assez facile de se connecter en SSL. Voilà un petit exemple qui fait le début de l'authentification :

    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
    31
    32
    33
    34
    35
    36
    37
    38
        string hostname = "pop.gmail.com";
        int port = 995;
     
        using (var client = new TcpClient(hostname, port))
        using (var stream = client.GetStream())
        using (var sslStream = new SslStream(stream, false, ValidateRemoteCertificate))
        {
            sslStream.AuthenticateAsClient(hostname);
     
            using (var reader = new StreamReader(sslStream, Encoding.ASCII))
            using (var writer = new StreamWriter(sslStream, Encoding.ASCII))
            {        
                writer.AutoFlush = true;
     
                string response = reader.ReadLine();
                Console.WriteLine(response);
     
                string request = "USER *********";
                writer.WriteLine(request);
     
                response = reader.ReadLine();
                Console.WriteLine(response);
     
                request = "PASS *********";
                writer.WriteLine(request);
     
                response = reader.ReadLine();
                Console.WriteLine(response);
            }
        }
     
     
    ...
     
    static bool ValidateRemoteCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }

    Pour l'instant la méthode qui valide le certificat est un peu simpliste, c'était juste pour vérifier le principe...

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Attention! Bien souvent en entreprise, toutes les communications vers l'exterieur sont coupées. Il n'y a qu'un serveur proxy pour les connections HTTP mais tous les autres protocoles sont bloqués. Par conséquent, une solution comme celle ci n'est pas faisable dans ces environnements.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Dév
    Inscrit en
    Mai 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Mai 2011
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bah pourtant, des logiciels comme Outlook fonctionnent parfaitement... Outlook implémente un protocole HTTP ? ON M'AURAIT MENTI ?! (lol).

    Plus sérieusement, j'en étais plus ou moins parvenu à la même conclusion, et plus j'y réfléchis, plus je songe sérieusement à devoir utiliser Outlook :\

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Sambotte Voir le message
    Bah pourtant, des logicielles comme Outlook fonctionnent parfaitement... Outlook implémente un protocole HTTP ? ON M'AURAIT MENTI ?! (lol).
    Bah c'est surtout que le serveur POP de ton entreprise est sur le réseau local, pas sur internet...

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par Sambotte Voir le message
    Bah pourtant, des logicielles comme Outlook fonctionnent parfaitement... Outlook implémente un protocole HTTP ? ON M'AURAIT MENTI ?! (lol).

    Plus sérieusement, j'en étais plus ou moins parvenu à la même conclusion, et plus j'y réfléchis, plus je songe sérieusement à devoir utiliser Outlook :\
    Il peut y'avoir des règles d'exception pour certains serveurs. Mais effectivement y'a de grandes chances que le serveur mail soit à l'intérieur de la boite. Et si ca se trouve, c'est ptet un Exchange Server qui n'est pas en protocole POP3 (bien que ca soit possible d'ajouter un binding POP3).
    Je pense que le plus astucieux pour le coup est d'aller voir un admin réseau

  9. #9
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    gmail fait parti des boites à mails souvant bloquée.

    Où je suis actuellement, on ne peut pas y accéder, d'aucune façon (même en webmail), ce qui me pose problème car ma SSII utilise GM pour ses mails... heureusement, il y a une solution de copie vers une autre adresse.

    Après, les commentaires de Nathanael et tomlev sont justes (comme toujours)

    Enfin pour les composants, entre acheter un compo qui coûte 200€ et passer une semaine sur un dev... La rentabilité de l'achat peut vite se vérifier. Imagine un presta à 400€ par jour (ce qui n'est pas énorme) revient plus cher que le compo à 200€. Mais si tu es stagiaire, tu es "gratuit"...
    En informatique, le problème se situe toujours entre le clavier et l'écran !
    Il y a deux chemins entre le clavier et l'écran : Par l'UC et par l'utilisateur.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Dév
    Inscrit en
    Mai 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Mai 2011
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Globalement je suis d'accord avec toi kheironn, en revanche, pour la "compo", si le protocole POP3 est bloqué, alors de toute façon rien n'y fera.

    En revanche, j'ai bien accès à gmail via internet (webmail).
    Je pense que Nathanael est dans le vrai, tous les protocoles hormis http sont bloqués.

    J'irais voir un admin réseau la semaine prochaine, je vous tiendrais informé de ce qu'il en est via ce topic =)

    En tout cas, merci à tous pour vos réponses

Discussions similaires

  1. Impossible de lire un mail avec une piece jointe
    Par fafadu31520 dans le forum Thunderbird
    Réponses: 1
    Dernier message: 26/02/2011, 09h49
  2. Réponses: 3
    Dernier message: 29/05/2008, 21h06
  3. [C#] envoyer un mail avec une piece jointe
    Par arnauann dans le forum C#
    Réponses: 5
    Dernier message: 22/08/2007, 10h09
  4. [ASP 3] Envoyer un Mail avec une piece jointe générer
    Par soltani.slim dans le forum ASP
    Réponses: 4
    Dernier message: 15/02/2006, 10h16
  5. [Mail] Récupérer une pièce jointe d'un mail
    Par heddicmi dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2005, 16h21

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