2008-09-04 7 views
73

Ich bin auf der Suche nach einer Methode zum Lesen von E-Mails mit Pop3 in C# 2.0. Momentan verwende ich den Code, der in CodeProject gefunden wurde. Diese Lösung ist jedoch weniger als ideal. Das größte Problem ist, dass E-Mails, die in Unicode geschrieben sind, nicht unterstützt werden.E-Mail lesen mit Pop3 in C#

Antwort

71

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

+1

Link zu NuGet: https://www.nuget.org/packages/OpenPop.NET/ – razon

15

Herunterladen der E-Mail über das POP3-Protokoll ist der einfache Teil der Aufgabe. Das Protokoll ist ziemlich einfach und der einzige schwierige Teil könnten fortgeschrittene Authentifizierungsmethoden sein, wenn Sie kein Klartextpasswort über das Netzwerk senden wollen (und den SSL verschlüsselten Kommunikationskanal nicht benutzen können). Einzelheiten finden Sie unter RFC 1939: Post Office Protocol - Version 3 und RFC 1734: POP3 AUTHentication command.

Der schwierige Teil kommt, wenn Sie die empfangene E-Mail analysieren müssen, was bedeutet, MIME-Format in den meisten Fällen zu analysieren. Sie können schnell & schmutzigen MIME-Parser in ein paar Stunden oder Tagen schreiben und es wird 95 +% aller eingehenden Nachrichten behandeln. Die Verbesserung der Parser so dass es fast jede E-Mail-Mittel analysieren kann:

  • bekommen E-Mail-Proben aus dem beliebtestenen Mail-Clients gesendet und verbessert die Parser, um von ihnen erzeugten Fehler und RFC Fehlinterpretationen zu beheben.
  • Stellen Sie sicher, dass Nachrichten gegen RFC für Nachrichtenheader und Inhalt nicht abstürzt Ihr Parser und dass Sie in der Lage sein werden, jeden lesbaren oder erratenen Wert aus der entstellten E-Mail zu lesen nach links) korrekte Codierung für spezifische Sprache usw.)
  • UNICODE
  • Attachments und hierarchische Nachrichtenelement Baum wie in "Mime torture email sample"
  • S/MIME (signierte und verschlüsselte E-Mails zu sehen.
  • und so weiter

einen robusten MIME-Parser Debuggen dauert Monate Arbeit. Ich weiß, weil ich meinem Freund dabei zugesehen habe, einen solchen Parser für die unten erwähnte Komponente zu schreiben und ein paar Unit-Tests dafür schrieb ;-)

Zurück zur ursprünglichen Frage.

Nach code taken from our POP3 Tutorial page und Links helfen dir:

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

Im Grunde sagst du "kaufe meine Komponente", oder? Damit ist nichts verkehrt, das klingt nach einer guten Komponente. – MarkJ

+3

Sie können jede Komponente von Drittanbietern (kostenlos oder kommerziell) ausprobieren. Mein Beitrag versuchte darauf hinzuweisen, dass das Schreiben solcher Komponenten sowohl schwierig als auch zeitaufwendig ist, da umfangreiche Tests erforderlich sind - etwas, was man ohne einen umfangreichen Fehlerbericht mit Daten von einer großen Anzahl von echten Benutzern kaum tun kann. Es wäre schön, wenn Sie die Rebex-Komponente wählen würden, aber wenn Sie sich für eine andere entscheiden, habe ich kein Problem damit. Einen eigenen MIME-Parser zu schreiben oder einen Proof-of-Concept-Code zu benutzen, der im Web gefunden wird, ist in diesem Fall nicht der beste Weg. Aber ich bin vielleicht voreingenommen ;-), zeichne dein eigenes Ergebnis und teste den Code zuerst. –

+0

Kann ich Rebex-Komponente für Nachrichten aus dem Exchange 2003-Posteingang verwenden? – Kiquenet

2

mich Mode alt nennen, aber warum eine 3rd-Party-Bibliothek verwenden für ein einfaches Protokoll. Ich habe POP3-Leser in webbasierter ASP.NET-Anwendung mit System.Net.Sockets.TCPClient und System.Net.Security.SslStream für die Verschlüsselung und Authentifizierung implementiert. Was die Protokolle betrifft, gibt es nach dem Öffnen der Kommunikation mit dem POP3-Server nur eine Handvoll Befehle, mit denen Sie sich befassen müssen. Es ist ein sehr einfaches Protokoll, mit dem man arbeiten kann.

8

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

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

die Datei POP3Main.cs Siehe POP3Client.cs und insert_bug.aspx

5

Sie auch Mail.dll mail component versuchen können, hat es die SSL-Unterstützung, Unicode und multi-nationale 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 dies ein kommerzielles Produkt ist, das ich erstellt habe.

+1

Kann ich es für den Zugriff auf Posteingang Exchange 2003 verwenden? – Kiquenet

+0

Ja können Sie. Sie müssen nur IMAP- oder POP3-Protokolle aktivieren. –

3

Ich würde OpenPOP nicht empfehlen. Ich habe gerade ein paar Stunden damit verbracht, ein Problem zu beheben - OpenPOPs POPClient.GetMessage() gab auf mysteriöse Weise null zurück. Ich debuggte dies und fand heraus, dass es ein String-Index-Bug war - 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 verschlingen.

Auch ist das Projekt meist ruhend ... die letzte Veröffentlichung war 2004

Denn jetzt sind wir noch OpenPOP, aber ich nehme haben einen Blick auf einige der anderen Projekte Personen empfohlen Hier.

+0

was empfiehlt dich ?? thx – Kiquenet

+16

Hallo. Ich habe das OpenPop.NET-Projekt überholt und in einen funktionelleren Zustand versetzt. Diese Versuche wurden entfernt und die Bibliothek ist jetzt viel stabiler. Ich glaube nicht, dass dieser Posteintrag mehr gültig ist. – foens

3

HigLabo.Mail ist einfach zu bedienen. Hier ist ein Beispiel Nutzung:

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 es von https://github.com/higty/higlabo oder Nuget erhalten können [HigLabo]

2

ich gerade versucht SMTPop und es funktionierte.

  1. Ich habe this heruntergeladen.
  2. Hinzugefügt smtpop.dll Bezug auf meine C# .NET-Projekt

den folgenden Code schrieb:

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(); 
     } 
    } 
} 
+0

Ich habe Code versucht, aber es gibt keine E-Mail-Körper - alle Details kommen normalerweise außer Körper ??? irgendeine Idee ????? – AbuQauod