wake-up-neo.com

verwenden von c # .net-Bibliotheken zum Suchen nach IMAP-Nachrichten von Google Mail-Servern

Hat jemand einen Beispielcode, der das .Net-Framework verwendet, das über IMAP-SSL eine Verbindung zu Google Mail-Servern herstellt, um nach neuen E-Mails zu suchen?

30
Belliez
20
lakshmanaraj

Als Autor des oben genannten Projekts kann ich sagen, dass es ja SSL unterstützt. 

Ich arbeite gerade an einer neuen Version der Bibliothek, die vollständig asynchron sein wird, um die Geschwindigkeit zu erhöhen, mit der sie mit IMAP-Servern interagieren kann. 

Dieser Code ist zwar nicht vollständig, kann jedoch zusammen mit der ursprünglichen synchronen Bibliothek (die auch SSL unterstützt) von der oben genannten Code-Plex-Site heruntergeladen werden.

17

Ich würde empfehlen, auf MailKit zu schauen, da es wahrscheinlich die robusteste Mail-Bibliothek auf dem Markt ist und Open Source (MIT) ist.

Eine der erstaunlichen Eigenschaften von MailKit besteht darin, dass alle Netzwerk-APIs abgebrochen werden können (etwas, das ich in keiner anderen IMAP-Bibliothek gefunden habe).

Es ist auch die einzige Bibliothek, die ich kenne und die das Threading von Nachrichten unterstützt.

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 aus der anderen ähnlichen Frage gepostet. Sehen Sie, was passiert, wenn sie so ähnlich werden?

Ich habe schon lange nach einer IMAP-Lösung gesucht, und nachdem ich einige ausprobiert habe, gehe ich mit AE.Net.Mail .

Es gibt keine Dokumentation, die ich als Nachteil empfinde, aber ich konnte dies durch den Blick auf den Quellcode (yay für Open Source!) Und die Verwendung von Intellisense herausholen. Der folgende Code stellt eine Verbindung zum IMAP-Server von Google Mail her:

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

Ich bin nicht mit dieser Bibliothek oder irgendetwas verbunden, aber ich habe es sehr schnell und stabil gefunden.

13
DMan

Lumisoft.net enthält sowohl IMAP-Client- als auch Servercode, den Sie verwenden können. 

Ich habe es verwendet, um E-Mails von Google Mail herunterzuladen. Das Objektmodell ist nicht das Beste, aber es ist praktikabel und scheint recht flexibel und stabil zu sein.

Hier ist das teilweise Ergebnis meiner Spitze, um es zu benutzen. Die ersten 10 Header werden mit Umschlägen abgerufen. Anschließend wird die vollständige Nachricht abgerufen:

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

Es gibt keine .NET Framework-Unterstützung für IMAP. Sie müssen eine Drittanbieter-Komponente verwenden.

Testen Sie die E-Mail-Komponente Mail.dll , sie ist sehr erschwinglich und einfach zu bedienen. Sie unterstützt auch 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);
}

Bitte beachten Sie, dass dies ein kommerzielles Produkt ist, das ich erstellt habe.

Sie können es hier herunterladen: https://www.limilabs.com/mail .

7

MailSystem.NET enthält alle Ihre Anforderungen an IMAP4. Es ist kostenlos und Open Source.

(Ich bin am Projekt beteiligt)

5
user333306

die Quelle zur ssl-Version davon ist hier: http://atmospherian.wordpress.com/downloads/

1
Belliez

LumiSoft.ee - funktioniert super, ziemlich einfach. Kompiliert mit .NET 4.0.

Hier sind die erforderlichen Links zu ihrer lib und ihren Beispielen . Downloads Main:

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

Code-Beispiele:

befinden sich hier: ... lsWWW/Download/Downloads/Beispiele /

.NETZ:

befinden sich hier: ... lsWWW/Download/Downloads/Net /

Ich setze ein simples Beispiel mit ihrer lib für codeplex (IMAPClientLumiSoft.codeplex.com). Sie müssen ihre Bibliotheken direkt von ihrer Website erhalten. Ich schließe sie nicht ein, weil ich ihren Code nicht pflege und keine Rechte an dem Code habe. Gehen Sie zu den obigen Links und laden Sie sie direkt herunter. Ich habe LumiSoft-Projekteigenschaften in meinem VS2010 festgelegt, um alles in .NET 4.0 zu erstellen, was ohne Fehler gemacht wurde .. Die Beispiele sind ziemlich komplex und vielleicht sogar zu eng codiert, wenn nur ein Beispiel. Ich erwarte jedoch, dass diese sich allgemein an fortgeschrittene Entwickler richten.

Ihr Projekt arbeitete mit kleineren Verbesserungen. Die Verbesserungen: Ihr IMAP-Client-Winform-Beispiel wird in den Projekteigenschaften auf "Release" gesetzt, um zu verhindern, dass VS Debug-Punkte durchbricht. Sie müssen die Lösung "Configuration Manager" verwenden, um das Projekt auf "Aktiv (Debug)" zu setzen, damit Haltepunkte funktionieren. Ihre Beispiele verwenden anonyme Methoden für Ereignishandler, was eine sehr gute Codierung darstellt ... nicht wirklich gut als Lehrmittel. Mein Projekt verwendet "benannte" Event-Methodenhandler, damit Sie Haltepunkte innerhalb der Handler setzen können. Ihr Code ist jedoch eine hervorragende Möglichkeit, mit Inline-Code umzugehen. Sie haben möglicherweise die neueren Lambda-Methoden verwendet, die seit .NET 3.0 verfügbar sind, aber nicht und ich habe nicht versucht, sie zu konvertieren.

Von ihren Beispielen aus habe ich den IMAP-Client auf ein Minimum reduziert.

0
wph101larrya

Eine andere Alternative: HigLabo

https://higlabo.codeplex.com/documentation

Gute Diskussion: 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