Domanda

Sto cercando un metodo per leggere le e-mail utilizzando Pop3 in C# 2.0.Attualmente sto utilizzando il codice trovato in CodiceProgetto.Tuttavia, questa soluzione è tutt’altro che ideale.Il problema più grande è che non supporta le email scritte in Unicode.

È stato utile?

Soluzione

Ho usato con successo OpenPop.NET per accedere alle e-mail tramite POP3.

Altri suggerimenti

scaricare l'e-mail tramite il protocollo POP3 è la parte facile dell'attività.Il protocollo è abbastanza semplice e l'unica parte difficile potrebbero essere i metodi di autenticazione avanzati se non si desidera inviare una password in chiaro sulla rete (e non è possibile utilizzare il canale di comunicazione crittografato SSL).Vedere RFC 1939:Protocollo dell'ufficio postale - Versione 3 E RFC1734:Comando AUTHentication POP3 per dettagli.

La parte difficile arriva quando devi analizzare l'e-mail ricevuta, il che significa analizzare il formato MIME nella maggior parte dei casi.Puoi scrivere un parser MIME veloce e sporco in poche ore o giorni e gestirà oltre il 95% di tutti i messaggi in arrivo.Migliorare il parser in modo che possa analizzare quasi tutte le email significa:

  • ottenere campioni di email inviati dai client di posta più popolari e migliorare il parser per correggere errori e interpretazioni errate RFC da essi generati.
  • Assicurarsi che i messaggi che violano RFC per le intestazioni e il contenuto dei messaggi non blocchino il parser e che tu sia in grado di leggere ogni valore leggibile o indovinabile dall'e-mail danneggiata
  • corretta gestione delle problematiche di internazionalizzazione (es.lingue scritte da destra a sinistra, codifica corretta per una lingua specifica, ecc.)
  • UNICODE
  • Allegati e struttura gerarchica degli elementi dei messaggi come mostrato in "Esempio di email di tortura mimata"
  • S/MIME (e-mail firmate e crittografate).
  • e così via

Il debug di un robusto parser MIME richiede mesi di lavoro.Lo so, perché stavo guardando il mio amico scrivere uno di questi parser per il componente menzionato di seguito e stavo scrivendo anche alcuni test unitari per questo ;-)

Torniamo alla domanda iniziale.

Seguente codice tratto dalla nostra pagina Tutorial POP3 e i collegamenti ti aiuteranno:

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

La mia applicazione open source BugTracker.NET include un client POP3 in grado di analizzare MIME.Sia il codice POP3 che il codice MIME provengono da altri autori, ma puoi vedere come si adatta tutto nella mia app.

Per l'analisi MIME, utilizzo http://anmar.eu.org/projects/sharpmimetools/.

Vedere il file POP3Main.cs, POP3Client.cs e insert_bug.aspx

Puoi anche provare Componente di posta Mail.dll, dispone del supporto SSL, unicode e del supporto e-mail multinazionale:

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

Puoi scaricarlo qui su https://www.limilabs.com/mail

Tieni presente che questo è un prodotto commerciale che ho creato.

Non consiglierei OpenPOP.Ho appena trascorso alcune ore a eseguire il debug di un problema: POPClient.GetMessage() di OpenPOP restituiva misteriosamente null.Ho eseguito il debug di questo e ho scoperto che si trattava di un bug dell'indice delle stringhe: vedi la patch che ho inviato qui: http://sourceforge.net/tracker/?func=detail&aid=2833334&group_id=92166&atid=599778.È stato difficile trovare la causa poiché sono presenti blocchi catch{} vuoti che inglobano le eccezioni.

Inoltre, il progetto è per lo più dormiente...l'ultima versione è stata nel 2004.

Per ora stiamo ancora utilizzando OpenPOP, ma darò un'occhiata ad alcuni degli altri progetti che le persone hanno consigliato qui.

HigLabo.Mail è facile da usare.Ecco un esempio di utilizzo:

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

puoi ottenerlo da https://github.com/higty/higlabo o Nuget [HigLabo]

chiamami vecchio stile, ma perché usare una libreria di terze parti per un protocollo semplice.Ho implementato i lettori POP3 nell'applicazione ASP.NET basata sul web con System.Net.Sockets.TCPClient e System.Net.Security.SslStream per la crittografia e l'autenticazione.Per quanto riguarda i protocolli, una volta aperta la comunicazione con il server POP3, ci sono solo una manciata di comandi da gestire.È un protocollo molto semplice con cui lavorare.

Ho appena provato SMTPop e ha funzionato.

  1. ho scaricato Questo.
  2. Aggiunto smtpop.dll riferimento al mio progetto C# .NET

Ha scritto il seguente codice:

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();
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top