Question

Je recherche une méthode de lecture d'e-mails à l'aide de Pop3 en C# 2.0.Actuellement, j'utilise le code trouvé dans CodeProjet.Cependant, cette solution est loin d’être idéale.Le plus gros problème est qu'il ne prend pas en charge les e-mails écrits en Unicode.

Était-ce utile?

La solution

J'ai utilisé avec succès OpenPop.NET pour accéder aux e-mails via POP3.

Autres conseils

le téléchargement de l'e-mail via le protocole POP3 est la partie la plus facile de la tâche.Le protocole est assez simple et la seule partie difficile pourrait être les méthodes d'authentification avancées si vous ne souhaitez pas envoyer de mot de passe en texte clair sur le réseau (et ne pouvez pas utiliser le canal de communication crypté SSL).Voir RFC1939 :Protocole de bureau de poste - Version 3 et RFC1734 :Commande d'authentification POP3 pour plus de détails.

Le plus difficile vient lorsque vous devez analyser l’e-mail reçu, ce qui signifie analyser le format MIME dans la plupart des cas.Vous pouvez écrire un analyseur MIME rapide et sale en quelques heures ou quelques jours et il traitera plus de 95 % de tous les messages entrants.Améliorer l'analyseur afin qu'il puisse analyser presque tous les e-mails signifie :

  • obtenir des échantillons d'e-mails envoyés par les clients de messagerie les plus populaires et améliorer l'analyseur afin de corriger les erreurs et les mauvaises interprétations RFC générées par ceux-ci.
  • Assurez-vous que les messages violant la RFC pour les en-têtes et le contenu des messages ne feront pas planter votre analyseur et que vous serez en mesure de lire chaque valeur lisible ou devinable de l'e-mail mutilé.
  • gestion correcte des problèmes d'internationalisation (par ex.langues écrites de droite à gauche, encodage correct pour une langue spécifique, etc.)
  • UNICODE
  • Pièces jointes et arborescence hiérarchique des éléments de message, comme indiqué dans "Exemple d'e-mail de torture mime"
  • S/MIME (e-mails signés et cryptés).
  • et ainsi de suite

Le débogage d’un analyseur MIME robuste prend des mois de travail.Je sais, parce que je regardais mon ami écrire un de ces analyseurs pour le composant mentionné ci-dessous et j'écrivais également quelques tests unitaires pour celui-ci ;-)

Revenons à la question initiale.

Suivant code extrait de notre page Tutoriel POP3 et des liens vous aideraient:

// 
// create client, connect and log in 
Pop3 client = new Pop3();
client.Connect("pop3.example.org");
client.Login("username", "password");

// get message list 
Pop3MessageCollection list = client.GetMessageList();

if (list.Count == 0)
{
    Console.WriteLine("There are no messages in the mailbox.");
}
else 
{
    // download the first message 
    MailMessage message = client.GetMailMessage(list[0].SequenceNumber);
    ...
}

client.Disconnect();

Mon application open source BugTracker.NET inclut un client POP3 capable d'analyser MIME.Le code POP3 et le code MIME proviennent d'autres auteurs, mais vous pouvez voir comment tout cela s'articule dans mon application.

Pour l'analyse MIME, j'utilise http://anmar.eu.org/projects/sharpmimetools/.

Voir les fichiers POP3Main.cs, POP3Client.cs et insert_bug.aspx

Vous pouvez également essayer Composant de messagerie Mail.dll, il prend en charge SSL, Unicode et une prise en charge de la messagerie multinationale :

using(Pop3 pop3 = new Pop3())
{
    pop3.Connect("mail.host.com");           // Connect to server and login
    pop3.Login("user", "password");

    foreach(string uid in pop3.GetAll())
    {
        IMail email = new MailBuilder()
            .CreateFromEml(pop3.GetMessageByUID(uid));
          Console.WriteLine( email.Subject );
    }
    pop3.Close(false);      
}

Vous pouvez le télécharger ici sur https://www.limilabs.com/mail

Veuillez noter qu'il s'agit d'un produit commercial que j'ai créé.

Je ne recommanderais pas OpenPOP.Je viens de passer quelques heures à déboguer un problème - POPClient.GetMessage() d'OpenPOP renvoyait mystérieusement null.J'ai débogué cela et j'ai découvert qu'il s'agissait d'un bug d'index de chaîne - voir le correctif que j'ai soumis ici : http://sourceforge.net/tracker/?func=detail&aid=2833334&group_id=92166&atid=599778.Il était difficile d'en trouver la cause car il existe des blocs catch{} vides qui avalent les exceptions.

De plus, le projet est pour l’essentiel en sommeil…la dernière version date de 2004.

Pour l'instant, nous utilisons toujours OpenPOP, mais je vais jeter un œil à certains des autres projets recommandés ici.

HigLabo.Mail est facile à utiliser.Voici un exemple d'utilisation :

using (Pop3Client cl = new Pop3Client()) 
{ 
    cl.UserName = "MyUserName"; 
    cl.Password = "MyPassword"; 
    cl.ServerName = "MyServer"; 
    cl.AuthenticateMode = Pop3AuthenticateMode.Pop; 
    cl.Ssl = false; 
    cl.Authenticate(); 
    ///Get first mail of my mailbox 
    Pop3Message mg = cl.GetMessage(1); 
    String MyText = mg.BodyText; 
    ///If the message have one attachment 
    Pop3Content ct = mg.Contents[0];         
    ///you can save it to local disk 
    ct.DecodeData("your file path"); 
} 

tu peux l'obtenir de https://github.com/higty/higlabo ou Nuget [HigLabo]

appelez-moi à l'ancienne mais pourquoi utiliser une bibliothèque tierce pour un protocole simple.J'ai implémenté des lecteurs POP3 dans une application Web ASP.NET avec System.Net.Sockets.TCPClient et System.Net.Security.SslStream pour le cryptage et l'authentification.En ce qui concerne les protocoles, une fois que vous ouvrez la communication avec le serveur POP3, vous n'avez à gérer qu'une poignée de commandes.C’est un protocole très simple à utiliser.

Je viens d'essayer SMTPop et cela a fonctionné.

  1. j'ai téléchargé ce.
  2. Ajoutée smtpop.dll référence à mon projet C# .NET

J'ai écrit le code suivant :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;    
using SmtPop;

namespace SMT_POP3 {

    class Program {
        static void Main(string[] args) {
            SmtPop.POP3Client pop = new SmtPop.POP3Client();
            pop.Open("<hostURL>", 110, "<username>", "<password>");

            // Get message list from POP server
            SmtPop.POPMessageId[] messages = pop.GetMailList();
            if (messages != null) {

                // Walk attachment list
                foreach(SmtPop.POPMessageId id in messages) {
                    SmtPop.POPReader reader= pop.GetMailReader(id);
                    SmtPop.MimeMessage msg = new SmtPop.MimeMessage();

                    // Read message
                    msg.Read(reader);
                    if (msg.AddressFrom != null) {
                        String from= msg.AddressFrom[0].Name;
                        Console.WriteLine("from: " + from);
                    }
                    if (msg.Subject != null) {
                        String subject = msg.Subject;
                        Console.WriteLine("subject: "+ subject);
                    }
                    if (msg.Body != null) {
                        String body = msg.Body;
                        Console.WriteLine("body: " + body);
                    }
                    if (msg.Attachments != null && false) {
                        // Do something with first attachment
                        SmtPop.MimeAttachment attach = msg.Attachments[0];

                        if (attach.Filename == "data") {
                           // Read data from attachment
                           Byte[] b = Convert.FromBase64String(attach.Body);
                           System.IO.MemoryStream mem = new System.IO.MemoryStream(b, false);

                           //BinaryFormatter f = new BinaryFormatter();
                           // DataClass data= (DataClass)f.Deserialize(mem); 
                           mem.Close();
                        }                     

                        // Delete message
                        // pop.Dele(id.Id);
                    }
               }
           }    
           pop.Quit();
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top