el uso de las bibliotecas C # .NET para comprobar si hay mensajes IMAP desde los servidores de Gmail [cerrada]

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

  •  23-08-2019
  •  | 
  •  

Pregunta

¿Alguien tiene algún código de ejemplo en que hace uso de .NET Framework que se conecta a través de IMAP googlemail servidores SSL para comprobar si hay nuevos mensajes de correo electrónico?

Otros consejos

A medida que el autor del proyecto por encima de lo que puedo decir que sí lo hace compatible con SSL.

Actualmente estoy trabajando en una nueva versión de la biblioteca que será totalmente asíncrona para aumentar la velocidad con la que puede interactuar con los servidores IMAP.

Ese código, aunque no completa, se puede descargar, junto con la biblioteca síncrona original (que también es compatible con SSL), desde el sitio de código compleja vinculada a arriba.

Me gustaría recomendar mirando MailKit ya que es probablemente la biblioteca electrónico más robusta por ahí y es de código abierto (MIT) .

Una de las cosas impresionantes sobre MailKit es que todas las API de red se pueden cancelar (algo que no he visto disponible en cualquier otra biblioteca IMAP).

También es la única biblioteca que yo sepa que es compatible con el roscado de los mensajes.

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

Cruz-registrado desde la otra pregunta similar. Vea lo que sucede cuando se hacen tan similares?

He estado buscando una solución IMAP desde hace un tiempo, y después de probar unos cuantos, voy con AE.Net.Mail .

No hay ninguna documentación, que considero un inconveniente, pero yo era capaz de batir esto mirando el código fuente (yay para el código abierto!) Y el uso de IntelliSense. El código siguiente se conecta específicamente para el servidor IMAP de 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();

No estoy afiliado con esta biblioteca ni nada, pero he encontrado que es muy rápido y estable.

Lumisoft.net tiene tanto el cliente IMAP y código de servidor que pueda utilizar.

Lo he utilizado para descargar correo electrónico de Gmail. El modelo de objetos no es la mejor, pero es viable, y parece ser bastante flexible y estable.

Este es el resultado parcial de mi pico de usarlo. Se obtiene los primeros 10 cabeceras con sobres, y luego recupera el mensaje 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);

    }
}

No hay soporte de marco .NET de IMAP. Tendrá que utilizar algún componente tercera parte.

Trate Mail.dll correo electrónico componente , es muy asequible y fácil de usar, que también es compatible con 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);
}

Tenga en cuenta que este es un producto comercial que he creado.

Puede descargarlo aquí:. https://www.limilabs.com/mail

MailSystem.NET contiene toda su necesidad de IMAP4. Es de código libre y abierto.

(estoy involucrado en el proyecto)

la fuente de la versión SSL de esto está aquí: http://atmospherian.wordpress.com/downloads /

Otra alternativa: HigLabo

https://higlabo.codeplex.com/documentation

Buena discusión: 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 - funciona muy bien, bastante fácil. Compila con .NET 4.0.

Aquí están los enlaces necesarios con su lib y ejemplos. Descargas principal:

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

Ejemplos de código:

se encuentran aquí: ... lsWWW / Descargar / Descargas / Ejemplos /

.NET:

se encuentran aquí: ... lsWWW / Descargar / Descargas / Net /

Estoy poniendo una muestra SIMPLE utilizando su lib en CodePlex (IMAPClientLumiSoft.codeplex.com). Debe tener en sus bibliotecas directamente desde su sitio. No estoy incluyendo ellos porque no mantienen su código ni tengo ningún derecho sobre el código. Ir a los enlaces de arriba y descargarlo directamente. Me puse las propiedades del proyecto Lumisoft en mi VS2010 para construir todo ello en .NET 4.0, que lo hizo sin errores. Sus muestras son bastante complejos y tal vez incluso demasiado de codificación cuando sólo un ejemplo apretado. Aunque espero que éstas están dirigidas a los desarrolladores de nivel avanzado en general.

Su proyecto trabajó con ajustes menores. Los ajustes: Su cliente IMAP ejemplo Winform se encuentra en las propiedades del proyecto como "Release", que impide que se rompa VS en los puntos de depuración. Debe utilizar la solución "Gestor de configuración" para configurar el proyecto para "Activo (depuración)" puntos de ruptura para trabajar. Sus ejemplos utilizan métodos anónimos por controladores de eventos que es grande codificación apretada ... no es bueno real como una herramienta de enseñanza. Mi proyecto utiliza "con nombre" manipuladores método de evento para que pueda establecer puntos de ruptura dentro de los manipuladores. Sin embargo la suya es una excelente manera de manejar el código en línea. Puede ser que hayan utilizado los métodos más recientes disponibles desde Lambda .NET 3.0, pero no lo hizo y yo no tratar de convertirlos.

A partir de sus muestras Simplifiqué el cliente IMAP a su mínima expresión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top