You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#获取收件箱中最新的20封邮件?

解决POP3客户端获取收件箱前20封最新邮件的问题

我用Windows Forms C#开发邮件应用,想显示收件箱的前20封最新邮件,但现有代码只会列出随机20封,代码如下:

using (var client = new Pop3Client())
{
    client.Connect("pop.gmail.com", 995, true);
    client.Authenticate("mail", "passwrd");

    for (int i = client.Count - 20; i < client.Count; i++)
    {
        var message = client.GetMessage(i);
        Console.WriteLine("Subject: {0}", message.Subject);
        txtBoxMails.AppendText("Subject: " + message.Subject + "\n");
    }

    client.Disconnect(true);
}

问题原因

POP3协议里,邮件编号从1开始,编号1是最旧的邮件,最大编号是最新的邮件。你之前的代码用client.Count -20作为起始值,如果收件箱邮件总数不足20封,这个值会变成负数,循环逻辑出错,导致拿到异常的邮件列表。

修正后的代码

using (var client = new Pop3Client())
{
    client.Connect("pop.gmail.com", 995, true);
    client.Authenticate("mail", "passwrd");

    // 计算起始位置:邮件总数<=20就从第1封开始,否则取倒数第20封作为起点
    int startIndex = Math.Max(1, client.Count - 19);
    
    // 按【最新到最旧】的顺序显示20封邮件
    for (int i = client.Count; i >= startIndex; i--)
    {
        var message = client.GetMessage(i);
        Console.WriteLine("Subject: {0}", message.Subject);
        txtBoxMails.AppendText("Subject: " + message.Subject + "\r\n");
    }

    // 如果需要按【这20封里从旧到新】的顺序显示,替换成下面的循环
    // for (int i = startIndex; i <= client.Count; i++)
    // {
    //     var message = client.GetMessage(i);
    //     Console.WriteLine("Subject: {0}", message.Subject);
    //     txtBoxMails.AppendText("Subject: " + message.Subject + "\r\n");
    // }

    client.Disconnect(true);
}

关键说明

  • 用Math.Max(1, client.Count -19)保证起始索引不会小于1,避免邮件数量不足20时的索引越界问题。
  • POP3的邮件编号规则是核心:最旧邮件编号为1,每新增一封邮件编号递增,所以最大编号对应的是最新邮件。
  • 两种遍历方式可选,根据你想要的显示顺序切换即可。

内容的提问来源于stack exchange,提问作者malcom32

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:26:02