Frage

Ich suche nach einer Methode zum Lesen von E-Mails mit Pop3 in C# 2.0.Derzeit verwende ich Code aus CodeProjekt.Allerdings ist diese Lösung alles andere als ideal.Das größte Problem besteht darin, dass in Unicode geschriebene E-Mails nicht unterstützt werden.

War es hilfreich?

Lösung

Ich habe es erfolgreich verwendet OpenPop.NET um über POP3 auf E-Mails zuzugreifen.

Andere Tipps

Das Herunterladen der E-Mail über das POP3-Protokoll ist der einfache Teil der Aufgabe.Das Protokoll ist recht einfach und der einzige schwierige Teil könnten erweiterte Authentifizierungsmethoden sein, wenn Sie kein Klartextkennwort über das Netzwerk senden möchten (und den SSL-verschlüsselten Kommunikationskanal nicht verwenden können).Sehen RFC 1939:Post-Office-Protokoll – Version 3 Und RFC 1734:POP3-AUTHentication-Befehl für Details.

Der schwierige Teil entsteht, wenn Sie die empfangene E-Mail analysieren müssen, was in den meisten Fällen das Parsen des MIME-Formats bedeutet.Sie können einen Quick&Dirty-MIME-Parser in wenigen Stunden oder Tagen schreiben und er verarbeitet über 95 % aller eingehenden Nachrichten.Die Verbesserung des Parsers, sodass er nahezu jede E-Mail analysieren kann, bedeutet:

  • Erhalten Sie E-Mail-Beispiele von den beliebtesten E-Mail-Clients und verbessern Sie den Parser, um von ihnen generierte Fehler und RFC-Fehlinterpretationen zu beheben.
  • Stellen Sie sicher, dass Nachrichten, die gegen RFC in Bezug auf Nachrichtenkopfzeilen und -inhalte verstoßen, Ihren Parser nicht zum Absturz bringen und dass Sie jeden lesbaren oder erratenen Wert aus der entstellten E-Mail lesen können
  • Richtiger Umgang mit Internationalisierungsthemen (z.B.von rechts nach links geschriebene Sprachen, korrekte Kodierung für eine bestimmte Sprache usw.)
  • UNICODE
  • Anhänge und hierarchischer Nachrichtenelementbaum, wie in gezeigt „Beispiel für eine Pantomimenfolter-E-Mail“
  • S/MIME (signierte und verschlüsselte E-Mails).
  • und so weiter

Das Debuggen eines robusten MIME-Parsers erfordert monatelange Arbeit.Ich weiß es, weil ich meinem Freund beim Schreiben eines solchen Parsers für die unten erwähnte Komponente zugesehen habe und auch ein paar Unit-Tests dafür geschrieben habe ;-)

Zurück zur ursprünglichen Frage.

Nachfolgend Code aus unserer POP3-Tutorial-Seite und Links würden Ihnen helfen:

// 
// 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();

Meine Open-Source-Anwendung BugTracker.NET Enthält einen POP3-Client, der MIME analysieren kann.Sowohl der POP3-Code als auch der MIME-Code stammen von anderen Autoren, aber Sie können in meiner App sehen, wie alles zusammenpasst.

Für das MIME-Parsing verwende ich http://anmar.eu.org/projects/sharpmimetools/.

Siehe die Dateien POP3Main.cs, POP3Client.cs und insert_bug.aspx

Sie können es auch versuchen Mail-Komponente Mail.dll, Es verfügt über SSL-Unterstützung, Unicode und multinationale E-Mail-Unterstützung:

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);      
}

Sie können es hier herunterladen https://www.limilabs.com/mail

Bitte beachten Sie, dass es sich hierbei um ein kommerzielles Produkt handelt, das ich erstellt habe.

Ich würde OpenPOP nicht empfehlen.Ich habe gerade ein paar Stunden damit verbracht, ein Problem zu debuggen – POPClient.GetMessage() von OpenPOP gab auf mysteriöse Weise null zurück.Ich habe dies debuggt und festgestellt, dass es sich um einen String-Index-Fehler handelt – siehe den Patch, den ich hier eingereicht habe: http://sourceforge.net/tracker/?func=detail&aid=2833334&group_id=92166&atid=599778.Es war schwierig, die Ursache zu finden, da es leere Catch{}-Blöcke gibt, die Ausnahmen verschlucken.

Außerdem ruht das Projekt größtenteils ...die letzte Veröffentlichung erfolgte im Jahr 2004.

Im Moment verwenden wir noch OpenPOP, aber ich werde mir einige der anderen Projekte ansehen, die hier empfohlen wurden.

HigLabo.Mail ist einfach zu bedienen.Hier ist ein Beispiel für die Verwendung:

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"); 
} 

Sie können es von bekommen https://github.com/higty/higlabo oder Nuget [HigLabo]

Nennen Sie mich altmodisch, aber warum sollten Sie für ein einfaches Protokoll eine Bibliothek eines Drittanbieters verwenden?Ich habe POP3-Reader in einer webbasierten ASP.NET-Anwendung mit System.Net.Sockets.TCPClient und System.Net.Security.SslStream für die Verschlüsselung und Authentifizierung implementiert.Was die Protokolle anbelangt, müssen Sie sich nach der Herstellung der Kommunikation mit dem POP3-Server nur noch mit einer Handvoll Befehlen befassen.Es ist ein sehr einfach zu handhabendes Protokoll.

Ich habe gerade SMTPop ausprobiert und es hat funktioniert.

  1. Ich habe heruntergeladen Das.
  2. Hinzugefügt smtpop.dll Verweis auf mein C# .NET-Projekt

Habe den folgenden Code geschrieben:

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();
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top