использование библиотек c # .net для проверки наличия сообщений IMAP с серверов gmail [закрыто]

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

  •  23-08-2019
  •  | 
  •  

Вопрос

Есть ли у кого-нибудь пример кода, в котором используется .Net framework, который подключается к серверам googlemail через IMAP SSL для проверки наличия новых электронных писем?

Это было полезно?

Решение

Указанный здесь URL-адрес может представлять для вас интерес

http://www.codeplex.com/InterIMAP

который был расширением к

http://www.codeproject.com/KB/IP/imaplibrary.aspx?fid=91819&df=90&mpp=25&noise=5&sort=Position&view=Quick&fr=26&select=2562067#xx2562067xx

Другие советы

Как автор вышеупомянутого проекта, я могу сказать, что да, он поддерживает SSL.

В настоящее время я работаю над новой версией библиотеки, которая будет полностью асинхронной, чтобы увеличить скорость, с которой она может взаимодействовать с серверами IMAP.

Этот код, хотя и не полный, можно загрузить вместе с оригинальной синхронной библиотекой (которая также поддерживает SSL) с сайта code plex, на который дана ссылка выше.

Я бы рекомендовал посмотреть на Почтовый набор поскольку это, вероятно, самая надежная почтовая библиотека из существующих, и она имеет открытый исходный код (MIT).

Одна из удивительных особенностей MailKit заключается в том, что все сетевые API можно отменить (чего я не видел ни в одной другой библиотеке IMAP).

Это также единственная известная мне библиотека, которая поддерживает потоковую передачу сообщений.

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

Кросс-пост с другого аналогичного вопроса.Видите, что происходит, когда они становятся настолько похожими?

Я уже некоторое время ищу решение IMAP, и, перепробовав довольно много, я выбираю AE.Net.Mail.

Документации нет, что я считаю недостатком, но я смог ускорить это, просмотрев исходный код (ура открытому исходному коду!) и используя Intellisense.Приведенный ниже код подключается конкретно к IMAP-серверу 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();

Я не связан с этой библиотекой или чем-то еще, но я нашел ее очень быстрой и стабильной.

Lumisoft.net содержит как клиентский, так и серверный код IMAP, который вы можете использовать.

Я использовал его для загрузки электронной почты из Gmail.Объектная модель не самая лучшая, но она работоспособна и кажется довольно гибкой и стабильной.

Вот частичный результат моего спайка по его использованию.Он извлекает первые 10 заголовков с конвертами, а затем извлекает полное сообщение:

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

    }
}

Для IMAP нет поддержки .NET framework.Вам нужно будет использовать какой-нибудь сторонний компонент.

Попробуй Mail.dll компонент электронной почты, это очень доступный по цене и простой в использовании, он также поддерживает 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);
}

Пожалуйста, обратите внимание, что это созданный мной коммерческий продукт.

Вы можете скачать его здесь: https://www.limilabs.com/mail.

MailSystem.NET содержит все, что вам нужно для IMAP4.Это бесплатно и с открытым исходным кодом.

(Я участвую в проекте)

исходный код этой ssl-версии находится здесь: http://atmospherian.wordpress.com/downloads/

Другая альтернатива:ХигЛабо

https://higlabo.codeplex.com/documentation

Хорошая дискуссия: 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 - работает отлично, довольно просто.Компилируется с .NET 4.0.

Вот необходимые ссылки на их библиотеку и примеры.Основные загрузки:

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

Примеры кода:

находятся здесь:...lsWWW/Скачать/Downloads/Примеры/

.NET:

находятся здесь:...lsWWW/Скачать/Downloads/Net/

Я размещаю ПРОСТОЙ образец, используя их библиотеку в codeplex (IMAPClientLumiSoft.codeplex.com).Вы должны получить их библиотеки непосредственно с их сайта.Я не включаю их, потому что я не поддерживаю их код и у меня нет никаких прав на этот код.Перейдите по ссылкам выше и загрузите его напрямую.Я установил свойства проекта LumiSoft в моем VS2010, чтобы собрать все это в .NET 4.0, что он и сделал без ошибок.Их образцы представляют собой довольно сложное и, возможно, даже чрезмерно жесткое кодирование, когда это просто пример.Хотя я ожидаю, что они предназначены для разработчиков продвинутого уровня в целом.

Их проект работал с незначительными изменениями.Хитрости:Их пример Winform IMAP-клиента задан в свойствах проекта как "Release", что предотвращает сбой VS в точках отладки.Вы должны использовать решение "Configuration Manager", чтобы установить для проекта значение "Активный (отладочный)", чтобы точки останова работали.В их примерах используются анонимные методы для обработчиков событий, что является отличным жестким кодированием...не очень хорош в качестве учебного пособия.Мой проект использует обработчики "именованных" методов событий, поэтому вы можете устанавливать точки останова внутри обработчиков.Однако это отличный способ обработки встроенного кода.Возможно, они использовали более новые методы Lambda, доступные начиная с .NET 3.0, но не сделали этого, и я не пытался их преобразовать.

Основываясь на их примерах, я упростил IMAP-клиент до минимума.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top