【问题标题】:C# Pop3 DeleteMessage does not delete emailC# Pop3 DeleteMessage 不删除电子邮件
【发布时间】:2025-12-07 01:10:01
【问题描述】:

实际上我想通过邮件唯一 ID 删除邮件消息(我使用 ActiveUp.Net.Mail.Pop3Client)

为此,我使用以下代码:

private void DeleteMessageByUID ( string uid , Pop3Client popClient )
{
     for (int i = 1; i <= popClient.MessageCount; i++)
     {
          Header email = popClient.RetrieveHeaderObject(i);

          if (email.MessageId == uid )
          {
                popClient.DeleteMessage(i);
                break;
          }
     }

     popClient.Disconnect();
}

但是从我删除所有邮件(最初邮件从邮箱中消失)开始大约两个小时后,我将能够找回它们(使用与之前删除的邮件相同的 UID)。

我不确定问题的原因是否在我的程序中,我猜是邮箱配置错误,但在联系系统管理员之前我会确定这一点。

【问题讨论】:

  • 代码没问题。我会与管理员核实您的电子邮件保留政策。也许您无法删除这些消息,它们必须保留在服务器上。

标签: c# pop3


【解决方案1】:

POP3 的工作方式是DeleteMessage() 方法发送的 DELE 命令实际上并没有删除该邮件,它所做的只是在 POP3 客户端使用 QUIT 命令断开连接时将其标记为将来删除。

我不确定 ActiveUp 的 POP3 客户端是如何工作的,但我的 (MailKit) 只会在您调用 client.Disconnect (true); 时发送 QUIT 命令(true 是退出参数)。

此外,FWIW,Message-Id 标头与唯一 ID 不同。请小心使用它作为以任何独特方式识别消息的机制,因为消息 ID 不一定是唯一的,也不是识别消息的安全方式。以这种方式使用 Message-Id 的客户端容易受到 DoS 攻击,黑客可以向您发送一封带有相同 Message-Id 的电子邮件,并强制您将其映射到错误的消息。

【讨论】:

  • 我检查了 ActiveUp 的 Disconnect 是如何实现的,似乎它不带任何参数,并且总是将“QUIT”命令发送回 Pop3 服务器(将服务器响应作为字符串返回)。另一个我不明白的问题是对 Message-Id 的关注,你能给我发一个链接来解释这个场景吗?提前感谢您的帮助。
  • 如果您发送一封 Message-Id 为“X”的电子邮件,而我作为一个破坏者想要颠覆您的邮件,我可以使用相同的 Message-Id 发送另一封邮件。如果收件人的客户认为您的邮件与我的邮件是重复的(我的邮件先到达),因为它具有相同的 Message-Id,那么收件人永远不会看到您的邮件。
  • 谢谢现在很清楚问题是什么,不是我的情况。我正在开发一个用于自动邮件交换的简单工具,但它适用于私有网络和“受信任”方之间。再次感谢您的澄清。