E-mail lezen met Pop3 in C#

Ik ben op zoek naar een methode om e-mails te lezen met Pop3 in C# 2.0. Momenteel gebruik ik code die te vinden is in CodeProject. Deze oplossing is echter niet ideaal. Het grootste probleem is dat het geen e-mails ondersteunt die in unicode zijn geschreven.


Antwoord 1, autoriteit 100%

Ik heb met succes OpenPop.NETgebruikt om toegang te krijgen tot e-mails via POP3.


Antwoord 2, autoriteit 22%

het downloaden van de e-mail via het POP3-protocol is het gemakkelijke deel van de taak. Het protocol is vrij eenvoudig en het enige moeilijke deel kunnen geavanceerde authenticatiemethoden zijn als u geen wachtwoord in leesbare tekst over het netwerk wilt verzenden (en het SSL-gecodeerde communicatiekanaal niet kunt gebruiken). Zie RFC 1939: Post Office Protocol – Versie 3
en RFC 1734: POP3-authenticatieopdrachtvoor details.

Het moeilijkste komt wanneer u de ontvangen e-mail moet ontleden, wat in de meeste gevallen betekent dat u de MIME-indeling moet ontleden. Je kunt een snelle en vuile MIME-parser in een paar uur of dagen schrijven en het zal 95+% van alle inkomende berichten verwerken. Het verbeteren van de parser zodat het bijna elke e-mail kan ontleden betekent:

  • het ontvangen van e-mailvoorbeelden die zijn verzonden vanaf de meest populaire e-mailclients en het verbeteren van de parser om fouten en RFC-verkeerde interpretaties die door hen worden gegenereerd te herstellen.
  • Ervoor zorgen dat berichten die de RFC voor berichtkoppen en inhoud schenden, uw parser niet laten crashen en dat u elke leesbare of raadbare waarde uit de verminkte e-mail kunt lezen
  • correcte afhandeling van internationaliseringsproblemen (bijv. talen geschreven van rechts naar links, correcte codering voor specifieke taal, enz.)
  • UNICODE
  • Bijlagen en hiërarchische boom met berichtitems zoals te zien in “Mime-marteling e-mailvoorbeeld”
  • S/MIME (ondertekende en versleutelde e-mails).
  • en ga zo maar door

Debuggen van een robuuste MIME-parser kost maanden werk. Ik weet het, want ik zag mijn vriend zo’n parser schrijven voor de onderstaande component en hij schreef er ook een paar unit-tests voor 😉

Terug naar de oorspronkelijke vraag.

Volgende code afkomstig van onze POP3-zelfstudiepaginaen links zouden u kunnen helpen:

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

Antwoord 3, autoriteit 11%

Mijn open source applicatie BugTracker.NETbevat een POP3-client die MIME kan ontleden. Zowel de POP3-code als de MIME-code zijn van andere auteurs, maar in mijn app kun je zien hoe het allemaal in elkaar steekt.

Voor de MIME-parsering gebruik ik http://anmar.eu.org/projects/sharpmimetools /.

Bekijk het bestand POP3Main.cs, POP3Client.cs en insert_bug.aspx


Antwoord 4, autoriteit 7%

Je kunt ook Mail.dll mailcomponentproberen, het heeft SSL-ondersteuning, unicode en -nationale e-mailondersteuning:

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

Je kunt het hier downloaden op https://www.limilabs.com/mail

Houd er rekening mee dat dit een commercieel product is dat ik heb gemaakt.


Antwoord 5, autoriteit 5%

noem me ouderwets, maar waarom een ​​bibliotheek van derden gebruiken voor een eenvoudig protocol. Ik heb POP3-lezers geïmplementeerd in een webgebaseerde ASP.NET-toepassing met System.Net.Sockets.TCPClient en System.Net.Security.SslStream voor de codering en authenticatie. Wat protocollen betreft, als je eenmaal de communicatie met de POP3-server hebt geopend, zijn er slechts een handvol opdrachten waarmee je te maken hebt. Het is een zeer eenvoudig protocol om mee te werken.


Antwoord 6, autoriteit 5%

Ik zou OpenPOP niet aanraden. Ik heb net een paar uur besteed aan het debuggen van een probleem – POPClient.GetMessage() van OpenPOP gaf op mysterieuze wijze nul terug. Ik debugde dit en ontdekte dat het een string-indexbug was – zie de patch die ik hier heb ingediend: http://sourceforge.net/tracker/?func=detail&aid=2833334&group_id=92166&atid=599778. Het was moeilijk om de oorzaak te vinden omdat er lege catch{}-blokken zijn die uitzonderingen opslokken.

Bovendien is het project grotendeels inactief… de laatste release was in 2004.

Voorlopig gebruiken we nog steeds OpenPOP, maar ik zal eens kijken naar enkele van de andere projecten die mensen hier hebben aanbevolen.


Antwoord 7, autoriteit 5%

HigLabo.Mail is gemakkelijk te gebruiken. Hier is een voorbeeld van gebruik:

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

je kunt het krijgen van https://github.com/higty/higlaboof Nuget [ HigLabo]


Antwoord 8, autoriteit 3%

Ik heb net SMTPop geprobeerd en het werkte.

  1. Ik heb dit.
  2. Verwijzing smtpop.dlltoegevoegd aan mijn C# .NET-project

Schreef de volgende code:

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

Other episodes