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

Windows Forms Discussion :

Récupération de pièces jointes via Mails (Pop)


Sujet :

Windows Forms

  1. #1
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut Récupération de pièces jointes via Mails (Pop)
    Bonjour à tous,
    Voilà maintenant plusieurs semaines que je suis sur une application. Dans celle-ci, j'ai mis en place un système de récupération de données contenues dans des fichiers textes. Donc on clique sur un bouton, un OpenFileDialog s'ouvre, on sélectionne un ou plusieurs fichiers, à la main, puis "OK", puis le reste se fait tout seul!
    Seulement pour des raisons pratiques, j'aimerais pouvoir récupérer ces fichiers (que je reçois par mail) directement par ce principe:

    Les mails contenant ces fichiers en pièces jointes, ont un titre spécifique, donc,
    d'abord lire les mails, si un mail contient le titre spécifié, alors récupérer ses pièces jointes, les "balancer" dans mon système de début pour les lire (déjà fait pour le système de lecture), écrire vite fait dans un log les opérations menées, effacer ce dernier mail, passer au suivant (si existe), etc...

    Pouvez-vous m'aider vraiment comment faire, je suis perdu . En utilisant 3 paramètres Pop (PopName, UserName, MdpUser).

    Je suis vraiment perdu de chez perdu, j'ai beau chercher des tutos et tout, je vois pas comment faire...
    Merci d'avance à tous...
    Défenseur de l'Apéro Social

  2. #2
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Points : 443
    Points
    443
    Par défaut
    Bonjour,

    Cette petite librairie devrait t'aider. Par contre je n'arrive pas à y accéder depuis le boulot. Dis moi si ça te convient. Normalement avec celle-ci, tu devrais pouvoir facilement télécharger des pièces jointes de mail.

  3. #3
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    bizarre que tu galères ou ait besoin d'une API

    http://lgmorand.developpez.com/dotnet/mail/
    j'ai fais ca il y a longtemps et très rapidement j'ai réussi à traiter les mails et savoir quand ca contenait une pièce jointe. En gros, ca revient pour toi à simplement lire l'entête et en extraire le contenu encodé de chaque PJ
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  4. #4
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Louis Guillaume, ton code est trop compliqué à utiliser, des erreurs sont générées partout, donc j'ai utilisé des bouts de codes ailleurs, et voici donc ce que j'ai:

    • 3 textbox contenant : ServeurPOP3, Login, Pass (je voudrais pouvoir les mettre dans un fichier XML, mais je verrais apres);
    • Un bouton qui se connecte au Serveur, et m'envoie dans une Texbox ReadOnly le nombre de messages.
    • Une Textbox de saisi de numéro de message voulu;
    • Un bouton pour récupérer les pièces jointes du message sélectionné;


    Maintenant, pas mal de truc reste incompris chez moi, comme les regex ,et j'ai du mal à comprendre tout le fonctionnement de certaines parties...

    Pouvez-vous m'aider pour maintenant atteindre mon but, c'est à dire, lire un à un les message, et si l'intitulé = "XXX" alors enclencher mon bouton de récupération de pièces jointes du message, apres je fais ma fonction de lecture/récup de données, passer au message suivant s'il existe...

    Voilà mon code:

    Dans ma FormPrincipale :


    Bouton de connection au serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try
                {
                    pop = new Pop(tb_pop.Text, tb_login.Text, tb_pass.Text, @"C:\\xxxxxxx");
                    tb_cononco.Text = "Connecté";
                    tb_nbmails.Text = pop.CountMails.ToString();                
                }
                catch (Exception exc)
                {
                    MessageBox.Show(exc.Message + "\n\n" + exc.StackTrace);
                }
    Bouton de récup des pièces jointes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     try
                {
                    pop.GetMail(Int32.Parse(textBox2.Text));                
                }
                catch (Exception exc)
                {
                    MessageBox.Show(exc.Message + "\n\n" + exc.StackTrace);
                }

    Dans ma Classe Pop :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Collections;
    using System.IO;
     
    struct Identifiant
    {
        public string server;
        public string user;
        public string password;
    }
     
    namespace Gestion
    {
        class Pop
        {
            Identifiant identifiant;
            string localDirectory;
     
            public Pop(string server, string user, string password, string localDirectory)
            {
                this.identifiant = new Identifiant();
                this.identifiant.server = server;
                this.identifiant.user = user;
                this.identifiant.password = password;
                this.localDirectory = localDirectory;
     
            }
     
     
            public int CountMails
            {
                get { return GetNumberOfNewMessages(); }
            }
     
     
            public Mail GetMail(int index)
            {
                NetworkStream ns = Connect();
                Mail mail = new Mail(ns, index, this.localDirectory);
                ns.Close();
                return mail;
            }
     
     
            private NetworkStream Connect()
            {
                TcpClient sender = new TcpClient(this.identifiant.server, 110);
                Byte[] outbytes;
                string input;
                NetworkStream ns = null;
     
                ns = sender.GetStream();
                StreamReader sr = new StreamReader(ns);
                Console.WriteLine(sr.ReadLine());
     
                input = "user " + this.identifiant.user + "\r\n";
                outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
                ns.Write(outbytes, 0, outbytes.Length);
                Mail.Recv(ns, 10);
     
                input = "pass " + this.identifiant.password + "\r\n";
                outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
                ns.Write(outbytes, 0, outbytes.Length);
                Mail.Recv(ns, 10);
     
                return ns;
            }
     
     
            private int GetNumberOfNewMessages()
            {
                NetworkStream ns = Connect();
                string cmd;
                string rep;
     
                // Envoi de la commande
                cmd = "stat";
                Mail.Send(cmd, ns);
     
                // Recuperation du resultat
                rep = Mail.Recv(ns, 15);
     
                string[] repList = rep.Split(' ');
                if (repList.Length != 3)
                    throw new Exception("Reponse du serveur POP incorrect : " + rep);
     
                return Int32.Parse(repList[1]);
            } 
     
        }
    }

    Dans ma Classe Mail :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    using System;
    using System.Net.Sockets;
    using System.IO;
    using System.Collections;
    using System.Text.RegularExpressions;
     
    struct HeadMail
    {
        public string From;
        public string To;
        public string Date;
    }
     
    namespace Gestion
    {
        class Mail
        {
            // VARIABLES		
            ArrayList head;
            ArrayList body;
            ArrayList brutCodedJoinPieces;	// Contains brutCodedJoinPieces
            ArrayList CodedJoinPieces;		// Contains a list of CodedJoinPieces
            HeadMail headMail;
            string localDirectory;
            int mailNumber;
     
            NetworkStream networkStream;	// Handle sur la connexion
     
            // CONSTRUCTEURS
            public Mail(NetworkStream ns, int number, string localDirectory)
            {
                this.head = new ArrayList();
                this.body = new ArrayList();
                this.brutCodedJoinPieces = new ArrayList();
                this.CodedJoinPieces = new ArrayList();
     
                this.networkStream = ns;
                this.mailNumber = number;
                this.localDirectory = localDirectory;
     
                this.GetMessage(this.mailNumber);
                this.GetHeadersMail(head);
                //this.GetJoinPieces(); // Doit traiter les pieces jointes divisés (A FAIRE)
     
                foreach (ArrayList pieceJointe in CodedJoinPieces)
                {
                    JoinPiece jp = new JoinPiece();
                    jp.GetData(pieceJointe);
                    jp.Export(localDirectory);
                }
            }
     
            // PROPRIETES
            public ArrayList Head
            {
                get { return head; }
            }
     
            public ArrayList Body
            {
                get { return body; }
            }
     
     
            // METHODES
            public static void Send(string cmd, NetworkStream ns)
            {
                string input = cmd + "\r\n";
                Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
                ns.Write(outbytes, 0, outbytes.Length);
            }
     
     
            public static ArrayList Recv(NetworkStream ns, string lastChar)
            {
                ArrayList list = new ArrayList();
                string returnValue = "";
                StreamReader sr = new StreamReader(ns);
     
     
                while (returnValue != lastChar)
                {
                    returnValue = sr.ReadLine();
                    list.Add(returnValue.ToString());
                }
     
                return list;
            }
     
            public static string Recv(NetworkStream ns, int length)
            {
                string returnValue = "";
     
                byte[] read = new byte[length];
                ns.Read(read, 0, length);
                returnValue = System.Text.Encoding.ASCII.GetString(read);
     
                return returnValue;
            }
     
            private void GetMessage(int number)
            {
                Send("retr " + number, networkStream);
                ArrayList brutmail = Recv(networkStream, ".");
                string boundary = SearchBoundary(brutmail);
     
                ArrayList pointeur;
     
                pointeur = head;
                Regex regEx = new Regex("^([-]*)?" + boundary + ".*", RegexOptions.IgnoreCase);
                foreach (string line in brutmail)
                {
                    if (regEx.IsMatch(line))
                    {
                        if ((pointeur != body) && (pointeur != head) && (boundary != ""))
                        {
                            if (pointeur.Count > 0)
                                CodedJoinPieces.Add(pointeur);
                            pointeur = new ArrayList();
                            continue;
                        }
                        if ((pointeur == body) && (boundary != ""))
                        {
                            pointeur = new ArrayList();
                            continue;
                        }
                        if (pointeur == head)
                        {
                            pointeur = body;
                            continue;
                        }
                    }
                    if ((pointeur.Count == 0) && (line == ""))
                        continue;
                    pointeur.Add(line);
                }
                if ((pointeur != body) && (pointeur != head) && (boundary != ""))
                {
                    if (pointeur.Count > 0)
                        CodedJoinPieces.Add(pointeur);
                }
     
     
            }
     
     
            /// <summary>
            /// Permet de séparer les pieces jointes multiples
            /// </summary>
            private void GetJoinPieces()
            {
                string boundary = SearchBoundary(brutCodedJoinPieces);
     
                // Si boundary == "" : Alors il n'existe qu'une seule piece jointe
                if (boundary.ToString() == "")
                {
                    this.CodedJoinPieces.Add(brutCodedJoinPieces);
                    return;
                }
                // Sinon il existe plusieurs pieces jointes :
                ArrayList pieceJoint = new ArrayList();
                foreach (string line in brutCodedJoinPieces)
                {
                    if (line == boundary)
                    {
                        if (pieceJoint.Count > 0)
                        {
                            CodedJoinPieces.Add(pieceJoint);
                            pieceJoint = new ArrayList();
                        }
                        continue;
                    }
                    pieceJoint.Add(line);
                }
                CodedJoinPieces.Add(pieceJoint);
     
            }
     
            public static string SearchBoundary(ArrayList brutMail)
            {
                Regex regBoundary = new Regex("boundary=\"(.*)\"$", RegexOptions.IgnoreCase);
                string boundary = "";
                foreach (string line in brutMail)
                {
                    if (regBoundary.IsMatch(line))
                    {
                        boundary = regBoundary.Match(line).Captures[0].ToString();
                        break;
                    }
                }
                string[] boundaryLine = boundary.Split('"');
                if (boundaryLine.Length > 1)
                    return boundaryLine[1];
                else
                    return "";
            }
     
            /// <summary>
            /// Sépare la partie en tete, message et pieces jointes
            /// </summary>
            /// <param name="mailcontent"></param>
            private void GetHeadersMail(ArrayList mailContent)
            {
                Regex regDate = new Regex("^Date:", RegexOptions.IgnoreCase);
                Regex regFrom = new Regex("^From:", RegexOptions.IgnoreCase);
                Regex regTo = new Regex("^To:", RegexOptions.IgnoreCase);
     
     
                foreach (string line in mailContent)
                {
                    if (regDate.IsMatch(line) && (this.headMail.Date == null))
                        this.headMail.Date = line.Substring(5).Trim();
                    if (regFrom.IsMatch(line) && (this.headMail.From == null))
                        this.headMail.From = line.Substring(5).Trim();
                    if (regTo.IsMatch(line) && (this.headMail.To == null))
                        this.headMail.To = line.Substring(3).Trim();
                }
            }
        }
    }

    Dans ma Classe Mail :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    using System;
    using System.Net.Sockets;
    using System.IO;
    using System.Collections;
    using System.Text.RegularExpressions;
    using System.Text;
     
    namespace Gestion
    {
        class JoinPiece
        {
            // VARIABLES
            ArrayList brutPieceJoin;
            ArrayList header;
            ArrayList codedData;
            ArrayList decodedData;
            string filename;
            string encoding;
            string localDirectory;
     
     
            // CONSTRUCTEURS
            public JoinPiece()
            {
                this.header = new ArrayList();
                this.codedData = new ArrayList();
                this.decodedData = new ArrayList();
                this.brutPieceJoin = new ArrayList();
     
            }
     
            // METHODES
            public void GetData(ArrayList brutData)
            {
                this.brutPieceJoin = brutData;
                Regex regEx = new Regex("filename=.*$");
                Regex regExCoding = new Regex("^Content-Transfer-Encoding:", RegexOptions.IgnoreCase);
                Regex regExFile = new Regex(@"[^?]+\?[^?]+?.*", RegexOptions.IgnoreCase);
                ArrayList pointeur;
                pointeur = header;
                string filename;
     
                foreach (string line in this.brutPieceJoin)
                {
                    // Recuperation du codage du contenu
                    if ((pointeur == header) && (regExCoding.IsMatch(line)))
                        this.encoding = line.Substring("Content-Transfer-Encoding:".Length).Trim();
     
     
                    // Passage à la sauvegarde du contenu codé
                    if (line.Equals(""))
                    {
                        pointeur = this.codedData;
                        continue;
                    }
     
                    if (regEx.IsMatch(line) && (this.filename == null))
                    {                    
                        filename = regEx.Match(line).Captures[0].ToString();
                        filename = filename.Replace("filename=\"", "");
                        this.filename = filename.Replace("\"", "");
                    }
                    pointeur.Add(line);
                }
            }
     
            public static string base64Decode(string data)
            {
                System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
                System.Text.Decoder utf8Decode = encoder.GetDecoder();
     
                byte[] todecode_byte = Convert.FromBase64String(data);
                int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
                char[] decoded_char = new char[charCount];
                utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
                string result = new String(decoded_char);
                return result;
            }
     
            public void Export(string localDirectory)
            {
                byte[] bytes;
                StreamWriter str;
                BinaryWriter bWr;
     
                if (codedData.Count == 0)
                    return;
     
                if (this.filename == null)
                    throw new Exception("Nom de fichier de la pièce jointe introuvable");
                if (this.filename.ToString().Equals(""))
                    throw new Exception("Nom de fichier de la pièce jointe introuvable");
     
                str = new StreamWriter(localDirectory + Path.DirectorySeparatorChar + this.filename);
     
                if (encoding.ToLower() == "base64")
                {
                    bWr = new BinaryWriter(str.BaseStream);
     
                    foreach (string line in codedData)
                    {
                        bytes = Convert.FromBase64String(line);
                        bWr.Write(bytes);
                    }
                }
                else
                {
                    foreach (string line in codedData)
                    {
                        str.Write(line);
                    }
                }
                str.Close();
            }
        }
    }
    bon ça fait un peu tout le code balancé, mais c'est pour que voyiez au mieux ma situation...

    Merci beaucoup.
    Défenseur de l'Apéro Social

  5. #5
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    t'es quand même le premier en trois ans en me disant que le code est compliqué. s'il compile pas directement, il te manque des ressources mais l'appli était totalement fonctionnelle puisque pendant trois jours entiers c'était mon client mail par défaut (bien sûr je l'avais complété pour gérer les mailto: et les PJ)

    c'est quoi? "\n\n" double nouvelle ligne? pourquoi pas faire comme tout le monde avec le \r\n ou le Environnement.NewLine?


    ensuite, beaucoup de trucs sont des erreurs qui vont te paraitre minimes mais qui sont flagrantes comme une textbox pour saisir un entier? y a un custom validator? ou maskedTextbox? parce que le Int32.Parse sans test...


    pour les regex, encore un article à moi (pas ma faute) mais si tu le lis et le comprend, t'auras aucun mal à comprendre les regex de ta classe
    http://lgmorand.developpez.com/dotnet/regex/

    tu verras surtout plutard que les regex servent plein de fois dans la vie d'un développeur

    pour le reste, je m'obstine tu devrais reprendre mon code car
    1- je me connecte
    2- je recupere tous les mails
    3- je les traite un par un
    (ce qui est exactement le même début que toi)
    ensuite là où moi je les affiche avec leurs info et leur contenu, t'as juste à lire leur contenu, extraire la PJ et la sauvegarder dans un dossier local.

    mon code te montrera aussi comment passer au suivant jusqu'à ce qu'il n'y en ait plus. je te dis pas de reprendre le code tel quel et le copier, je l'ai écris quand je débutais le .Net (et il est cochon sur plein de points) mais néanmoins, l'idée est là et ca fonctionne
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  6. #6
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Bon ok, je me suis peut etre emporté en disant qu'il était compliqué
    Allez, j'en ai marre là, Ctr-A , Suppr...
    Mr Morand tu sera désormais mon dieu, et tes tutos ma bible! Je me plonge dedans dès maintenant...

    Merci encore.
    Défenseur de l'Apéro Social

  7. #7
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Louis-Guillaume, j'ai bien étudié tes tutos, et surtout ton code source de LookOut.

    Par contre j'ai un problème de dis fonctionnement pour les mails en provenance de gmail... Le titre contient une partie de la date, une balise <br> , le sujet, <br>, et le début de To:... La date et l'heure n'étant plus renseignées... Aurais-tu une solution à ça? car pour que je relève les intitulés des mails, ils seront essentiellement en provenance de gmail alors bon...

    Et dans ton code, comment faire proprement pour que lors du parcours des mails, il affiche le premier, PUIS SI l'intitulé = XXX, alors il déclenche une fonction d'enregistrement de pièce jointe, puis va à la suivante...?

    Merci beaucoup pour ton tuto, il est extra!
    Défenseur de l'Apéro Social

  8. #8
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    j'ai pas le code sous les yeux mais pour gmail, déjà, y accèdes-tu en pop ou en imap? beaucoup de choses vont changer.

    ensuite si les infos sont pas remplis à cause de gmail alors c'est sur gmail que tu dois gueuler

    il affiche le premier, PUIS SI l'intitulé = XXX, alors il déclenche une fonction d'enregistrement de pièce jointe
    tu mets un IF au bon endroit
    j'ai pas le code sous les yeux donc je peux pas te dire
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  9. #9
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Lol oki, jvais trifouiller et bidouiller ça alors!

    Pour gmail, j'ai vu le bug, enfait, dans un mail "normal", on a une seule fois les mots clés "Date:" , "To:", etc., mais gmail génère de la me**de, et donc on se retrouve avec plusieurs fois ces mots clés.

    J'opterais pour mettre 2 variables bool: , , et dans la boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (szTemp != ".")
                        {}
    Je case à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (szTemp.ToLower().IndexOf("date:") != -1 && booldate != true)
    Hop', booldate=true; Non?

    Je test!
    Défenseur de l'Apéro Social

  10. #10
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Non, ça marche pas...
    Cest sale, mais je devrais utiliser a la suite des substring/trim?
    Défenseur de l'Apéro Social

  11. #11
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    vire la notation sz sur les variables string. c'est la notation hongroise mais elle est pas propre pour les "types".

    ta solution des booléens devrait pouvoir marcher. Si l'un des champs to ou from est rempli, ca devrait pas poser de problème mais pour être propre, tu peux utiliser les regex
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  12. #12
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Attends je bug là... les 2 mails de gmail que j'avais venaient d'un ami qui est sur gmail. La je test avec un mail depuis ma boite gmail, et tout marche...

    Ce que j'ai peur c'est que ce soit parce que ses mails à lui, étaient des réponses multiples, avec pièces jointes, et tout le tralala, mais j'ai testé en mettant un mega mail, en réponse, avec copie cachée, piece jointe et tout va bien... No comprendo senior... Gmail est universel dans ses syntaxes non, il y a pas de discrimination contre certaines personnes qui se payent des syntaxes bizarroïdes? enfin bon...

    Je continue de fouiller car c'est suspect ça...
    Défenseur de l'Apéro Social

  13. #13
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Je n'arrive pas à mettre un événement lorsque l'intitulé d'un mail est "XXX"...

    voilà les codes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for (int i = 1; i <= inbMsg; i++)
                {
                    lblStatus.Text = "Retrieve Message " + i.ToString() + " ...";
                    int intSizeMsg  =NombreDeMessages(2, i);
                    EnvoiCommande("retr " + i.ToString() + "\r\n");
                    parseMail(intSizeMsg);
                    if (Subject == "XXXX") 
                    {
                        //...
                        MessageBox.Show("Message repéré:  " + Subject);    //je m'en sers pour tester            
                    } 
                }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void parseMail(int size)
            {
                try
                {
                       //...
    if (szTemp.ToLower().IndexOf("subject:") != -1) // titre du mail
     
                                    szSubject = szTemp.Substring(8, szTemp.Length - 8);
                                    Subject = szSubject;   //variable "Subject" étant globale, donc devrait marcher...
    Et rien ne se passe, la MessageBox ne s'affiche pas lorsqu'un mail a ce titre là... Des idées.?

    Merci.
    Défenseur de l'Apéro Social

  14. #14
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    essaie en mode debug avec des breakpoints, ca fait des folies ces bêtes là
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  15. #15
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Sans mettre de Break Points, quand je lance en mode debug, la reception échoue... la MessageBox d'erreur "la reception a échoué" s'affiche... C'est pas normal non?

    EDIT: bizzare, les préférences de connection ont changé quand j'ai mis le mode debug... j'ai rechangé et c'est bon..

    Ou devrais je placer des break points?
    Défenseur de l'Apéro Social

  16. #16
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    J'ai placé un breakpoint à : "parseMail(intSizeMsg);
    ".
    J'ai regardé à chaque fois le contenu de la variable "Subject" et elle marche bien! Elle contient pour le mail voulu, la valeur "XXX", mais ma condition if ne marche pas... pourquoi?

    EDIT : J'ai déplacé ma boucle dans la méthode ParseMail directement après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (szTemp.ToLower().IndexOf("subject:") != -1) // titre du mail
     
                                    szSubject = szTemp.Substring(8, szTemp.Length - 8);
                                    Subject = szSubject;
                                    if (Subject == "XXX")
                                    {
                                        //...
                                        MessageBox.Show("Message repéré:  " + Subject);
                                    }
    Mais ça ne marche toujours pas!
    Défenseur de l'Apéro Social

  17. #17
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Subject.Trim().Equals("XXX")
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  18. #18
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    MAGIQUE

    Maintenant pourrais-tu m'expliquer vite fait, que je comprenne un peux le pourquoi du comment?

    Merci Louis Guillaume!
    Défenseur de l'Apéro Social

  19. #19
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    parce que quand tu parses le titre du mail, il y a sûrement un espace que tu ne vois pas à l'oeil nu mais qui est bien présent. la méthode Trim() est faite pour cela. supprimer les espaces en trop, au début et à la fin de la chaine de caractère.

    note, t'aurais pu mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Subject.Trim() == "XXX")
    dans ton cas, ca aurait marché aussi.

    pour le reste, il faudra choisir celui qui t'intéresse car l'un faire une comparaison par référence et l'autre par valeur
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  20. #20
    Membre habitué Avatar de Saten
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Ah d'accord, car lors du debug je ne voyais rien de la sorte! OK OK, super merci beaucoup encore!
    Défenseur de l'Apéro Social

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [10gR2] Envoi de mail avec pièce jointe via un form
    Par Lylye dans le forum Forms
    Réponses: 0
    Dernier message: 01/03/2013, 15h52
  2. [Forum] Envoi piéce jointe via un mail en php
    Par forzaakz dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 04/01/2012, 11h25
  3. [AC-2007] Envoyer par mail 2 pièces jointes via access et lotus notes
    Par Debutant10 dans le forum VBA Access
    Réponses: 10
    Dernier message: 12/08/2011, 09h34
  4. [AC-2007] Envoi pièce jointe via mail ?
    Par fragglerick dans le forum VBA Access
    Réponses: 9
    Dernier message: 23/05/2011, 13h49
  5. Envoi Pièce Jointe par Mail via 4D
    Par mxh77 dans le forum 4D
    Réponses: 6
    Dernier message: 25/09/2007, 18h05

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