Сохраните почту, которую мы прочитали, и загрузите только новую электронную почту в C # - PullRequest
2 голосов
/ 13 марта 2011

Я пишу программу «почтовый клиент» для проверки и чтения почты.У меня был загруженный исходный код многих авторов (в codeproject), но они загружались очень долго, и когда я перезапускаю, программа должна загрузить его снова.У меня есть идея сохранить почту, которую мы скачали, и загружать только новую почту.Как я могу сохранить почту?Я могу использовать XML или SQL?Я использовал POP3 и IMAP.

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Проверьте библиотеку Limisoft.

Вот пример кода:

using LumiSoft.Net.IMAP;
using LumiSoft.Net.IMAP.Client;
using LumiSoft.Net;

...

using (IMAP_Client client = new IMAP_Client())
{
    client.Connect("imap.gmail.com", 993, true);
    client.Login("your.username@gmail.com", "your_cool_password");
    client.SelectFolder("INBOX");

    IMAP_SequenceSet sequence = new IMAP_SequenceSet();
    //sequence.Parse("*:1"); // from first to last

    IMAP_Client_FetchHandler fetchHandler = new IMAP_Client_FetchHandler();

    fetchHandler.NextMessage += new EventHandler(delegate(object s, EventArgs e)
    {
        Console.WriteLine("next message");
    });

    fetchHandler.Envelope += new EventHandler<EventArgs<IMAP_Envelope>>(delegate(object s, EventArgs<IMAP_Envelope> e){
        IMAP_Envelope envelope = e.Value;
        if (envelope.From != null && !String.IsNullOrWhiteSpace(envelope.Subject))
        {
            Console.WriteLine(envelope.Subject);
        }

    });

    // the best way to find unread emails is to perform server search

    int[] unseen_ids = client.Search(false, "UTF-8", "unseen");
    Console.WriteLine("unseen count: " + unseen_ids.Count().ToString());

    // now we need to initiate our sequence of messages to be fetched
    sequence.Parse(string.Join(",", unseen_ids));

    // fetch messages now
    client.Fetch(false, sequence, new IMAP_Fetch_DataItem[] { new IMAP_Fetch_DataItem_Envelope() }, fetchHandler);

    // uncomment this line to mark messages as read
    // client.StoreMessageFlags(false, sequence, IMAP_Flags_SetType.Add, IMAP_MessageFlags.Seen);
}

Немного сложно, но отлично работает. Библиотека Limisoft не идеальна, поэтому убедитесь, что вы хорошо ее протестировали.

0 голосов
/ 13 марта 2011

Сообщения на сервере имеют UID (по крайней мере, для IMAP). По определению UID будет только увеличиваться. Это означает, что если у вас UID 321, следующий UID должен быть 322 или выше. Таким образом, вы можете сохранить «Last UID» в вашей БД, а затем получить самый высокий UID с сервера. Если он выше, чем последний, загрузите новые.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...