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

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


person Belliez    schedule 13.02.2009    source источник
comment
Вероятно, вам нужно только запросить примеры клиентов IMAP, а не что-то конкретное для googlemail, которое, AFAIK, является просто еще одним сервером IMAP.   -  person Adam Ralph    schedule 13.02.2009


Ответы (10)


Указанный здесь 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

person lakshmanaraj    schedule 13.02.2009
comment
этот проект не обрабатывает ssl-соединения, но есть комментарий от автора, который просит вас отправить ему электронное письмо, чтобы запросить ssl-код gmail, спасибо - person Belliez; 13.02.2009
comment
InterIMAP не идеален. Это действительно пугает, когда вы подключаетесь к большому почтовому ящику. (Поскольку он настаивает на чтении каждого заголовка, прежде чем он позволит вам что-либо делать). - person James; 15.05.2009
comment
Существует новая асинхронная версия библиотеки, которая решает многие проблемы со скоростью из предыдущей версии. - person Jason Miesionczek; 21.05.2009
comment
У проекта нет релизов. (?) - person Clay Lenhart; 05.01.2011
comment
Загляните внутрь базы кода для InterIMAP. Внутри есть что-то ужасное. Я бы не стал строить свою критически важную систему на основе этого кода. - person Shaul Behr; 29.03.2011
comment
@Shaul, уточни? Мне интересно знать, что я могу сделать, чтобы его улучшить. благодаря. - person Jason Miesionczek; 19.06.2011

Я бы порекомендовал взглянуть на MailKit, поскольку это, вероятно, самая надежная почтовая библиотека из существующих, и она имеет открытый исходный код (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);
                }
            }
        }
    }
}
person jstedfast    schedule 29.04.2014
comment
Здорово! Несколько слов о вашем примере. Кажется, он работает нормально, за исключением того, что вы можете исправить inbox.GetMessage (i, cancel.Token) на inbox.GetMessage (uid, cancel.Token), если вы продолжаете использовать foreach, а также вы можете захотеть сделать orderBy в своем пример обратного порядка необязателен, поскольку Gmail, похоже, не в восторге от расширения SORT (github.com/jstedfast/MailKit/blob/master/MailKit/Net/Imap/) - person Milan; 25.02.2015
comment
Могу убедиться, что это хорошая библиотека и проста в использовании! - person Danrex; 13.05.2015
comment
можно ли назначать цветовые категории для обработанных писем? - person coder771; 06.06.2016
comment
IMAP не поддерживает цветовые категории, но вы можете использовать настраиваемые метки (которые могут поддерживаться вашим сервером IMAP). - person jstedfast; 06.06.2016
comment
@jstedfast Является ли MailKit потокобезопасным? Т.е. Могу ли я иметь несколько подключений к одной учетной записи и одновременно загружать сообщения из разных почтовых ящиков? - person TheLethalCoder; 05.04.2017
comment
Это не то, что означает потокобезопасность :) Вы спрашиваете: поддерживает ли IMAP несколько подключений? Ответ на это: да. - person jstedfast; 05.04.2017

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

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

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

person Jason Miesionczek    schedule 13.02.2009
comment
Вы уже закончили это ..? - person shashwat; 14.09.2013
comment
Возможно, это комментарий к ответу lakshmanaraj, приведенный выше, и, возможно, в нем отсутствуют аспекты, чтобы быть полным ответом. Подумайте об упоминании о какой библиотеке вы имеете в виду и где мы можем ее получить, не требуя от меня просмотра другого ответа. Никогда не знаешь, другой ответ может быть удален, тогда все вкусности будут потеряны. Желаю тебе всего наилучшего - person MickyD; 20.11.2015

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

Я уже некоторое время искал решение 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", "[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();

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

person Dominic K    schedule 15.07.2011
comment
Извините, я давно собирался добавить некоторую документацию. : [Я не чувствовал необходимости публиковать двоичные файлы, потому что он находится на Nuget. Я скоро добавлю некоторые дополнительные функции IMAP (IDLE), поэтому обязательно опубликую для него как документацию, так и двоичные файлы. - person Andy Edinborough; 05.08.2011
comment
@Andy - Круто, это всегда приятно слышать! - person Dominic K; 05.08.2011
comment
Спасибо за отличный пример Дману и за прекрасную библиотеку Энди. Продолжайте в том же духе, надеюсь скоро увидеть эту документацию :) - person Matti Pastell; 02.09.2011
comment
@Matti - Пожалуйста :) Документы - это всегда хорошо! - person Dominic K; 02.09.2011
comment
Какая классная библиотека. Я был готов к работе за секунды. Прекрасно работает. - person CleverPatrick; 01.05.2014
comment
@AndyEdinborough Является ли AE потокобезопасным? Т.е. Могу ли я иметь несколько подключений к одной учетной записи и одновременно загружать сообщения из разных почтовых ящиков? - person TheLethalCoder; 05.04.2017

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

    }
}
person Bruno Lopes    schedule 08.04.2009
comment
Похоже, он изменил свой синтаксис. Вместо вызова Authenticate вы вызываете client.Login (_username, _password); И FetchMessages был заменен Fetch, который работает совсем по-другому. Код Lumisoft, тем не менее, великолепен, но можно было бы использовать больше примеров того, как его использовать. - person Jason Short; 19.11.2009
comment
Спасибо! Реализация LumiSoft творит чудеса! - person Cetin Sert; 04.05.2010
comment
Эта библиотека действительно великолепна! У ImapX есть проблема с декодированием Shift_JIS, когда он вызывает метод процесса, но Lumisoft.net делает большую работу. Да, довольно сложно понять объектную модель, но я могу внимательно взглянуть на исходный код, так что это действительно не имеет значения. - person Yoo Matsuo; 19.02.2011
comment
Я использовал его, но не могу подключить его к GMAIL, так как он не поддерживает SSL и нет возможности включить SSL. - person Akash Kava; 22.05.2012
comment
Этот код не работает. client.FetchMessages (не существует. Спасибо. Удалить из ссылки. - person alerya; 03.06.2014

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

Попробуйте компонент электронной почты 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.

person Pawel Lesnikowski    schedule 06.10.2009
comment
Я использую этот компонент много лет, и он мне очень нравится (никак не связан с @Pavel). Лучшая библиотека электронной почты для .NET, которую я когда-либо пробовал, стоит каждого пенни. Nuget-совместимый. - person Alex from Jitbit; 09.07.2018

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

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

person Community    schedule 18.11.2010
comment
Это простая и функциональная библиотека, рекомендую. - person Douglas H. M.; 17.06.2011
comment
Проект мертв и существует уже какое-то время. Образцы не собираются «из коробки» ни в VS 2008, ни в 2010. Я преобразовал их с повышением частоты, а затем пришлось преодолеть 16 эталонных проблем. Документация устарела, и страницы CodePlex остаются без ответа по любым вопросам / комментариям за последний год или более. Некоторые из недавних проблем связаны с неработающими обновлениями кода. Другие комментаторы говорят, что нужно загрузить исходный код и решить проблему самостоятельно. Я не рекомендую это использовать. - person sohtimsso1970; 28.06.2011
comment
проект довольно мертв. IDLE не работает должным образом mailsystem.codeplex.com/workitem/23586 - person Greg Dean; 05.11.2012
comment
Он не поддерживает имена почтовых ящиков, отличные от ASCII. - person Viacheslav Smityukh; 03.07.2013
comment
проект мертв? любые обновления ? - person Kiquenet; 10.01.2014


Другая альтернатива: HigLabo

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;
                }
            }
        }
    }
}
person Kiquenet    schedule 09.01.2014

LumiSoft.ee - работает отлично, довольно просто. Компилируется с .NET 4.0.

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

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

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

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

.СЕТЬ:

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

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

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

По их образцам я упростил клиент IMAP до минимума.

person wph101larrya    schedule 11.01.2011
comment
Их Net-библиотека относительно сложна, и я немного потерялся с многочисленными вспомогательными классами. Я ищу довольно простой пример доступа к Gmail с использованием клиента Lumisoft IMAP. Вы можете поделиться? - person Sriram B; 19.07.2013