【问题标题】:Save mail we had read and load only new email in C#保存我们已阅读的邮件并在 C# 中仅加载新电子邮件
【发布时间】:2011-07-14 13:11:19
【问题描述】:

我编写了一个“电子邮件客户端”程序来检查和阅读邮件。 我已经下载了许多作者的源代码(在 codeproject 中),但是他们的程序加载时间很长,当我重新启动程序时必须再次下载它。 我有想法保存我们下载的邮件,只下载新邮件。 如何保存邮件?我可以使用 XML 还是 SQL? 我使用 POP3 和 IMAP。

【问题讨论】:

  • 储蓄的哪一部分让您烦恼?您在选择 XML 文件还是 SQL 数据库时遇到问题?您对如何创建 XML 文件或保存在 SQL 数据库中是否有问题?您的内存表示形式如何?你有一些花哨的对象模型还是byte[]
  • 保存邮件的所有内容。我在 XML 和 SQl 之间选择并创建 XML 时遇到问题。任何记忆。

标签: c# imap pop3 email-client


【解决方案1】:

查看 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 库并不完美,所以一定要好好测试一下。

【讨论】:

  • 我试过这段代码,它按原样工作,但是我无法接收正文。我添加了新的 IMAP_Fetch_DateItem_Body() 并向 fetchHandler.Body 添加了一个事件处理程序,但在这个函数中,我只看到流为 null 和 BodySection 为空字符串。有什么建议或建议吗?
【解决方案2】:

服务器上的消息有一个 UID(至少对于 IMAP)。By definition UID 只会增加。这意味着如果您的 UID 为 321,则下一个 UID 必须为 322 或更高。因此,您可以将“最后一个 UID”存储在您的数据库中,然后从服务器获取最高的 UID。如果它高于您的上一个,请加载新的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2011-09-22
    相关资源
    最近更新 更多