utilizzando librerie C # .NET per verificare la presenza di messaggi IMAP dai server di Gmail [chiusa]

StackOverflow https://stackoverflow.com/questions/545724

  •  23-08-2019
  •  | 
  •  

Domanda

Qualcuno ha qualche codice di esempio in che fa uso del framework .Net che si connette al server tramite IMAP Googlemail SSL per verificare la presenza di nuovi messaggi di posta elettronica?

Altri suggerimenti

Come l'autore del progetto di cui sopra posso dire che sì, non supporta SSL.

Attualmente sto lavorando su una nuova versione della libreria che sarà completamente asincrono per aumentare la velocità con cui si può interagire con i server IMAP.

Questo codice, anche se non completo, può essere scaricato, insieme alla libreria sincrona originale (che supporta anche SSL), dal sito codice di plex linkato sopra.

io consiglierei di guardare MailKit quanto è probabilmente la biblioteca elettronica più robusto là fuori ed è Open Source (MIT) .

Una delle cose impressionanti su MailKit è che tutte le API di rete sono annullabile (qualcosa che non ho visto disponibile in qualsiasi altra libreria IMAP).

E 'anche l'unica biblioteca che io sappia che supporta threading dei messaggi.

using System;
using System.Net;
using System.Threading;

using MailKit.Net.Imap;
using MailKit.Search;
using MailKit;
using MimeKit;

namespace TestClient {
    class Program
    {
        public static void Main (string[] args)
        {
            using (var client = new ImapClient ()) {
                using (var cancel = new CancellationTokenSource ()) {
                    client.Connect ("imap.gmail.com", 993, true, cancel.Token);

                    // If you want to disable an authentication mechanism,
                    // you can do so by removing the mechanism like this:
                    client.AuthenticationMechanisms.Remove ("XOAUTH");

                    client.Authenticate ("joey", "password", cancel.Token);

                    // The Inbox folder is always available...
                    var inbox = client.Inbox;
                    inbox.Open (FolderAccess.ReadOnly, cancel.Token);

                    Console.WriteLine ("Total messages: {0}", inbox.Count);
                    Console.WriteLine ("Recent messages: {0}", inbox.Recent);

                    // download each message based on the message index
                    for (int i = 0; i < inbox.Count; i++) {
                        var message = inbox.GetMessage (i, cancel.Token);
                        Console.WriteLine ("Subject: {0}", message.Subject);
                    }

                    // let's try searching for some messages...
                    var query = SearchQuery.DeliveredAfter (DateTime.Parse ("2013-01-12"))
                        .And (SearchQuery.SubjectContains ("MailKit"))
                        .And (SearchQuery.Seen);

                    foreach (var uid in inbox.Search (query, cancel.Token)) {
                        var message = inbox.GetMessage (uid, cancel.Token);
                        Console.WriteLine ("[match] {0}: {1}", uid, message.Subject);
                    }

                    client.Disconnect (true, cancel.Token);
                }
            }
        }
    }
}

Croce pubblicata da un altra domanda simile. Vedi cosa succede quando ottengono così simili?

Sono stato alla ricerca di una soluzione IMAP per un po ', e dopo aver provato un bel po', io vado con AE.Net.Mail .

Non v'è alcuna documentazione, che considero un aspetto negativo, ma sono stato in grado di frusta questo in su, cercando il codice sorgente (yay per l'open source!) E l'utilizzo di Intellisense. Il codice di seguito si connette specificamente per server IMAP di Gmail:

// Connect to the IMAP server. The 'true' parameter specifies to use SSL
// which is important (for Gmail at least)
ImapClient ic = new ImapClient("imap.gmail.com", "name@gmail.com", "pass",
                ImapClient.AuthMethods.Login, 993, true);
// Select a mailbox. Case-insensitive
ic.SelectMailbox("INBOX");
Console.WriteLine(ic.GetMessageCount());
// Get the first *11* messages. 0 is the first message;
// and it also includes the 10th message, which is really the eleventh ;)
// MailMessage represents, well, a message in your mailbox
MailMessage[] mm = ic.GetMessages(0, 10);
foreach (MailMessage m in mm)
{
    Console.WriteLine(m.Subject);
}
// Probably wiser to use a using statement
ic.Dispose();

Io non sono affiliati con questa libreria o altro, ma ho trovato molto veloce e stabile.

Lumisoft.net ha sia client IMAP e il codice del server che si può uso.

L'ho usato per scaricare e-mail da Gmail. Il modello a oggetti non è la migliore, ma è praticabile, e sembra essere piuttosto flessibile e stabile.

Ecco il risultato parziale del mio picco di usarlo. Si va a prendere i primi 10 intestazioni con le buste, e poi recupera il messaggio completo:

using (var client = new IMAP_Client())
{
    client.Connect(_hostname, _port, _useSsl);
    client.Authenticate(_username, _password);
    client.SelectFolder("INBOX");
     var sequence = new IMAP_SequenceSet();
    sequence.Parse("0:10");
    var fetchItems = client.FetchMessages(sequence, IMAP_FetchItem_Flags.Envelope | IMAP_FetchItlags.UID,
                                        false, true);
    foreach (var fetchItem in fetchItems)
    {
        Console.Out.WriteLine("message.UID = {0}", fetchItem.UID);
        Console.Out.WriteLine("message.Envelope.From = {0}", fetchItem.Envelope.From);
        Console.Out.WriteLine("message.Envelope.To = {0}", fetchItem.Envelope.To);
        Console.Out.WriteLine("message.Envelope.Subject = {0}", fetchItem.Envelope.Subject);
        Console.Out.WriteLine("message.Envelope.MessageID = {0}", fetchItem.Envelope.MessageID);
    }
    Console.Out.WriteLine("Fetching bodies");
    foreach (var fetchItem in client.FetchMessages(sequence, IMAP_FetchItem_Flags.All, false, true)
    {             
        var email = LumiSoft.Net.Mail.Mail_Message.ParseFromByte(fetchItem.MessageData);             
        Console.Out.WriteLine("email.BodyText = {0}", email.BodyText);

    }
}

Non v'è alcun supporto .NET framework per IMAP. Avrete bisogno di usare qualche componente 3rd party.

Mail.dll email componente , è molto conveniente e facile utilizzare, supporta anche SSL :

using(Imap imap = new Imap())
{
    imap.ConnectSSL("imap.company.com");
    imap.Login("user", "password");

    imap.SelectInbox();
    List<long> uids = imap.Search(Flag.Unseen);
    foreach (long uid in uids)
    {
        string eml = imap.GetMessageByUID(uid);
        IMail message = new MailBuilder()
            .CreateFromEml(eml);

        Console.WriteLine(message.Subject);
        Console.WriteLine(message.Text);
    }
    imap.Close(true);
}

Si prega di notare che questo è un prodotto commerciale che ho creato.

È possibile scaricarlo qui:. https://www.limilabs.com/mail

MailSystem.NET contiene tutte le vostre necessità per IMAP4. E 'fonte libera e aperta.

(sono coinvolto nel progetto)

la fonte alla versione SSL di questo è qui: http://atmospherian.wordpress.com/downloads /

Un'altra alternativa: HigLabo

https://higlabo.codeplex.com/documentation

Buona discussione: https://higlabo.codeplex.com/discussions/479250

//====Imap sample================================//
//You can set default value by Default property
ImapClient.Default.UserName = "your server name";
ImapClient cl = new ImapClient("your server name");
cl.UserName = "your name";
cl.Password = "pass";
cl.Ssl = false;
if (cl.Authenticate() == true)
{
    Int32 MailIndex = 1;
    //Get all folder
    List<ImapFolder> l = cl.GetAllFolders();
    ImapFolder rFolder = cl.SelectFolder("INBOX");
    MailMessage mg = cl.GetMessage(MailIndex);
}

//Delete selected mail from mailbox
ImapClient pop = new ImapClient("server name", 110, "user name", "pass");
pop.AuthenticateMode = Pop3AuthenticateMode.Pop;
Int64[] DeleteIndexList = new.....//It depend on your needs
cl.DeleteEMail(DeleteIndexList);

//Get unread message list from GMail
using (ImapClient cl = new ImapClient("imap.gmail.com")) 
{
    cl.Port = 993;
    cl.Ssl = true; 
    cl.UserName = "xxxxx";
    cl.Password = "yyyyy";
    var bl = cl.Authenticate();
    if (bl == true)
    {
        //Select folder
        ImapFolder folder = cl.SelectFolder("[Gmail]/All Mail");
        //Search Unread
        SearchResult list = cl.ExecuteSearch("UNSEEN UNDELETED");
        //Get all unread mail
        for (int i = 0; i < list.MailIndexList.Count; i++)
        {
            mg = cl.GetMessage(list.MailIndexList[i]);
        }
    }
    //Change mail read state as read
    cl.ExecuteStore(1, StoreItem.FlagsReplace, "UNSEEN")
}


//Create draft mail to mailbox
using (ImapClient cl = new ImapClient("imap.gmail.com")) 
{
    cl.Port = 993;
    cl.Ssl = true; 
    cl.UserName = "xxxxx";
    cl.Password = "yyyyy";
    var bl = cl.Authenticate();
    if (bl == true)
    {
        var smg = new SmtpMessage("from mail address", "to mail addres list"
            , "cc mail address list", "This is a test mail.", "Hi.It is my draft mail");
        cl.ExecuteAppend("GMail/Drafts", smg.GetDataText(), "\\Draft", DateTimeOffset.Now); 
    }
}

//Idle
using (var cl = new ImapClient("imap.gmail.com", 993, "user name", "pass"))
{
    cl.Ssl = true;
    cl.ReceiveTimeout = 10 * 60 * 1000;//10 minute
    if (cl.Authenticate() == true)
    {
        var l = cl.GetAllFolders();
        ImapFolder r = cl.SelectFolder("INBOX");
        //You must dispose ImapIdleCommand object
        using (var cm = cl.CreateImapIdleCommand()) Caution! Ensure dispose command object
        {
            //This handler is invoked when you receive a mesage from server
            cm.MessageReceived += (Object o, ImapIdleCommandMessageReceivedEventArgs e) =>
            {
                foreach (var mg in e.MessageList)
                {
                    String text = String.Format("Type is {0} Number is {1}", mg.MessageType, mg.Number);
                    Console.WriteLine(text);
                }
            };
            cl.ExecuteIdle(cm);
            while (true)
            {
                var line = Console.ReadLine();
                if (line == "done")
                {
                    cl.ExecuteDone(cm);
                    break;
                }
            }
        }
    }
}

LumiSoft.ee - grandi opere, abbastanza facile. Compila con .NET 4.0.

Ecco i link necessari per la loro lib ed esempi. Downloads principale:

http://www.lumisoft.ee/lsWWW/Download/Downloads/

Esempi di codice:

si trovano qui: ... lsWWW / Download / Download / Esempi /

NET:

si trovano qui: ... lsWWW / Download / Download / Net /

Io sto mettendo un campione SEMPLICE usando la loro lib su CodePlex (IMAPClientLumiSoft.codeplex.com). È necessario ottenere le loro librerie direttamente dal loro sito. Io non le includo perché non mantenere il loro codice né ho alcun diritto sul codice. Vai a link qui sopra e scaricarlo direttamente. Ho impostato le proprietà del progetto Lumisoft nel mio VS2010 per costruire tutto in .NET 4.0, che lo ha fatto senza errori. I loro campioni sono abbastanza complesse e forse anche eccessivamente stretti codifica quando solo un esempio. Anche se mi aspetto che queste sono destinate a sviluppatori di livello avanzato in generale.

Il loro progetto ha lavorato con piccoli aggiustamenti. I ritocchi: Il loro esempio Winform IMAP client è impostato nelle proprietà del progetto come "uscita" che impedisce VS rottura sui punti di debug. È necessario utilizzare la soluzione "Configuration Manager" per impostare il progetto a "Active (Debug)" per i punti di interruzione a lavorare. I loro esempi utilizzano metodi anonimi per i gestori di eventi che è grande la codifica stretto ... non bene reale come strumento didattico. Il mio progetto utilizza "con nome" metodo di evento i gestori in modo da poter impostare i punti di interruzione all'interno dei gestori. Tuttavia il loro è un ottimo modo per gestire il codice inline. Potrebbero aver utilizzato i metodi Lambda più recenti disponibili dal .NET 3.0, ma non l'ha fatto e non ho cercato di convertirli.

Da loro campioni ho semplificato il client IMAP per minimo indispensabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top