C# 如何使用C在IMAP或POP中以编程方式删除邮件#

C# 如何使用C在IMAP或POP中以编程方式删除邮件#,c#,email,imap,tcpclient,C#,Email,Imap,Tcpclient,这是我删除邮件的代码。但是,它不起作用 public object Delete(int index) { StreamWriter.WriteLine("$ DELE {0}"+index); StreamWriter.Flush(); return Response(); } private string Response() { byte

这是我删除邮件的代码。但是,它不起作用

 public object Delete(int index)
        {
            StreamWriter.WriteLine("$ DELE {0}"+index);
            StreamWriter.Flush();
            return Response();    
        }
private string Response()
        {
            byte[] data = new byte[TcpClient.ReceiveBufferSize];
            int ret = NetworkStream.Read(data, 0, data.Length);
            return Encoding.ASCII.GetString(data).TrimEnd();
        }

为什么要将这两项添加到一起:

StreamWriter.WriteLine("$ DELE {0}"+index);
你的意思肯定是这样的:

StreamWriter.WriteLine(String.Format("$ DELE {0}",index));
StreamWriter.WriteLine(String.Format("DELE {0}",index));
A003 STORE 35 +FLAGS (\Deleted)
A004 EXPUNGE
也就是说,这看起来不是一个有效的IMAP命令。这看起来更像POP,即使这样,您也不应该在命令字符串中有
$
。你们遵循什么规格

如果连接到POP3服务器,该命令应如下所示:

StreamWriter.WriteLine(String.Format("$ DELE {0}",index));
StreamWriter.WriteLine(String.Format("DELE {0}",index));
A003 STORE 35 +FLAGS (\Deleted)
A004 EXPUNGE
如果您连接到IMAP服务器,我认为删除需要首先将邮件标记为已删除,然后将其删除。此外,IMAP中的所有命令都需要一个您需要生成的唯一标识符。根据规范:

每个客户端命令都以一个称为“标记”的标识符(通常是一个短字母数字字符串,例如A0001、A0002等)作为前缀。客户端为每个命令生成不同的标记

然后,要将邮件标记为已删除,请执行以下操作:

StreamWriter.WriteLine(String.Format("$ DELE {0}",index));
StreamWriter.WriteLine(String.Format("DELE {0}",index));
A003 STORE 35 +FLAGS (\Deleted)
A004 EXPUNGE
其中,
A003
是标记前缀,
35
是要删除的消息的序列号。但要永久删除所有标记的邮件,您还需要发送和
EXPUNGE
命令,该命令可能如下所示:

StreamWriter.WriteLine(String.Format("$ DELE {0}",index));
StreamWriter.WriteLine(String.Format("DELE {0}",index));
A003 STORE 35 +FLAGS (\Deleted)
A004 EXPUNGE

请注意,
EXPUNGE
可能会导致消息序列号发生更改,因此您不能假定在
EXPUNGE
命令完成后,与特定序列号关联的消息将是相同的。

我看到您已将标题改为IMAP或POP,但不能将POP命令发送到IMAP服务器,也不能将IMAP命令发送到POP服务器。您的服务器使用哪种协议?向IMAP服务器发送
DELE
命令显然会返回错误的命令,因为这不是一个有效的IMAP命令,正如我在回答中指出的。对不起,我正在使用IMAP服务器。我对这个主题不熟悉。有点困惑…我如何删除邮件我已经用更多的细节更新了我的答案,但对于IMAP来说这相当复杂。假设您已有的代码已经通过服务器验证,并且希望已经能够为您需要发送的每个命令生成一个标记。看起来他们正在使用
$
作为标记,而没有费心使其唯一。从我对规范的阅读来看,这在技术上是无效的,但如果您的服务器对此感到满意,它会使事情变得更容易。我说过要使用像
A003
A004
这样的标记,只需使用
$