web-dev-qa-db-fra.com

utilisation de bibliothèques c # .net pour rechercher des messages IMAP provenant de serveurs gmail

Quelqu'un a-t-il un exemple de code utilisant le framework .Net qui se connecte aux serveurs googlemail via IMAP SSL pour rechercher de nouveaux emails?

30
Belliez
20
lakshmanaraj

En tant qu'auteur du projet ci-dessus, je peux dire que oui, il prend en charge SSL. 

Je travaille actuellement sur une nouvelle version de la bibliothèque qui sera complètement asynchrone pour augmenter la vitesse d'interaction avec les serveurs IMAP. 

Ce code, bien que non complet, peut être téléchargé, ainsi que la bibliothèque synchrone d'origine (qui prend également en charge SSL), à partir du site de code plex lié à ci-dessus.

17
Jason Miesionczek

Je vous recommande de regarder MailKit car il s’agit probablement de la bibliothèque de courrier la plus robuste du marché et de la technologie Open Source (MIT).

L'un des avantages de MailKit est que toutes les API réseau sont annulables (quelque chose que je n'ai pas vu disponible dans aucune autre bibliothèque IMAP).

C'est aussi la seule bibliothèque que je connaisse qui supporte le threading des messages.

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

Cross posté de l'autre question similaire. Voyez ce qui se passe quand ils deviennent si semblables?

Je cherche une solution IMAP depuis un moment maintenant, et après en avoir essayé plusieurs, je vais avec AE.Net.Mail .

Il n’existe pas de documentation, ce qui est un inconvénient, mais j’ai pu résoudre ce problème en consultant le code source (yay pour l’open source!) Et en utilisant Intellisense. Le code ci-dessous se connecte spécifiquement au serveur 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", "[email protected]", "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();

Je ne suis pas affilié à cette bibliothèque ou quoi que ce soit, mais je l'ai trouvée très rapide et stable.

13
DMan

Lumisoft.net a le code client et serveur IMAP que vous pouvez utiliser. 

Je l'ai utilisé pour télécharger des emails à partir de Gmail. Le modèle objet n'est pas le meilleur, mais il est réalisable et semble plutôt flexible et stable.

Voici le résultat partiel de mon pic pour l'utiliser. Il récupère les 10 premiers en-têtes avec des enveloppes, puis le message complet:

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

    }
}
12
Bruno Lopes

Il n'y a pas de support .NET Framework pour IMAP. Vous devrez utiliser un composant tiers.

Essayez Le composant de messagerie Mail.dll , il est très abordable et facile à utiliser, il prend également en charge 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);
}

Veuillez noter qu'il s'agit d'un produit commercial que j'ai créé.

Vous pouvez le télécharger ici: https://www.limilabs.com/mail .

7

MailSystem.NET contient tous vos besoins pour IMAP4. C'est gratuit et open source.

(Je suis impliqué dans le projet)

5
user333306

la source de la version ssl de ceci est ici: http://atmospherian.wordpress.com/downloads/

1
Belliez

LumiSoft.ee - fonctionne très bien, assez facilement. Compile avec .NET 4.0.

Voici les liens requis pour leur bibliothèque et leurs exemples .

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

Exemples de code:

se trouvent ici: ... lsWWW/Téléchargement/Téléchargements/Exemples /

.NET:

se trouvent ici: ... lsWWW/Téléchargement/Téléchargements/Net /

Je mets un échantillon SIMPLE en utilisant leur lib sur codeplex (IMAPClientLumiSoft.codeplex.com). Vous devez obtenir leurs bibliothèques directement à partir de leur site. Je ne les inclus pas car je ne maintiens pas leur code et je n’ai aucun droit sur le code. Allez sur les liens ci-dessus et téléchargez-le directement. J'ai défini les propriétés du projet LumiSoft dans mon VS2010 de manière à ce qu'elles soient toutes construites dans .NET 4.0, ce qu'il a fait sans erreur .. Les échantillons sont assez complexes et peuvent même être codés de manière excessivement stricte. Bien que je m'attende à ce qu'ils s'adressent aux développeurs de niveau avancé en général.

Leur projet a fonctionné avec des ajustements mineurs. Les réglages: leur exemple IMAP Client Winform est défini dans les propriétés du projet sur "Libérer", ce qui empêche les VS de rompre les points de débogage. Vous devez utiliser la solution "Configuration Manager" pour définir le projet sur "Actif (Debug)" pour que les points d'arrêt fonctionnent. Leurs exemples utilisent des méthodes anonymes pour les gestionnaires d’événements, ce qui est un excellent codage serré… pas vraiment bon comme outil d’enseignement. Mon projet utilise des gestionnaires de méthode d'événement "nommés" afin que vous puissiez définir des points d'arrêt à l'intérieur des gestionnaires. Cependant, leur est un excellent moyen de gérer le code en ligne. Ils ont peut-être utilisé les méthodes Lambda les plus récentes disponibles depuis .NET 3.0, mais ne les ont pas utilisées et je n’ai pas essayé de les convertir.

À partir de leurs exemples, j'ai simplifié le client IMAP au strict minimum.

0
wph101larrya

Une autre alternative: HigLabo

https://higlabo.codeplex.com/documentation

Bonne discussion: 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;
                }
            }
        }
    }
}
0
Kiquenet