MailSystem.Net删除消息,IndexOnServer属性= 0

Riv*_*vka 6 c# imap

我正在使用MailSystem.NET并尝试从服务器中删除消息.问题是IndexOnServer属性为0,我收到以下错误:

Command "store 0 +flags.silent (\Deleted)" failed : 121031084812790 BAD Error in IMAP command STORE: Invalid messageset
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

    Imap4Client client = new Imap4Client();
    client.Connect(account.Server, account.Username, account.Password);
    var inbox = client.SelectMailbox("Inbox");
    MessageCollection messages = inbox.SearchParse("SINCE " + DateTime.Now.AddHours(-hours).ToString("dd-MMM-yyyy"));

    foreach (Message newMessage in messages)
    {
        inbox.DeleteMessage(newMessage.IndexOnServer, true);
    }
Run Code Online (Sandbox Code Playgroud)

如何获取正确的邮件索引以便删除?


编辑:

使用标准的基于1的循环的建议的问题是计数器索引将不与消息索引同步,因为在我的情况下,我正在搜索仅检索特定的消息子集(据我所知) .

谢谢.

Des*_*tar 5

您可以尝试通过UID进行删除,这对每条消息都应该更可靠和唯一.这对我来说过去很有用.

编辑:由于删除邮件会导致所有索引向下移动,因此您可以使用两个单独的计数器.一个用于跟踪您在整个框中迭代的时间(messagesLeft),另一个将跟踪当前消息索引,如果消息被删除将会减少1(因为它将向上移动一个位置).

Mailbox box = client.AllMailboxes["inbox"];
Fetch fetch = box.Fetch;
int messagesLeft = box.Count;
int msgIndex = 0;

while (messagesLeft > 0)
{
    msgIndex++;
    messagesLeft--;
    Message email = fetch.MessageObject(msgIndex);

    if (criteria)
    {
        box.UidDeleteMessage(fetch.Uid(msgIndex), true);
        msgIndex--;
    }
}
Run Code Online (Sandbox Code Playgroud)

在回答您的评论时,这里有一个更全面的例子,说明如何在不关心数字位置/索引的情况下使用UID进行删除.

class Email
{
       int UID { get; set; }
       DateTime Sent { get; set; }
       public string Body { get; set; }
       // put whichever properties you will need
}

List<Email> GetEmails(string mailbox);
{
    Mailbox box = client.AllMailboxes[mailbox];
    Fetch fetch = box.Fetch;

    List<Email> list = new List<Email>();
    for (int x = 1; x <= box.MessageCount; x++)
    {
        Message msg = fetch.MessageObject(x);
        list.Add(new Email() { } // set properties from the msg object
    }

    return list;
}

void DeleteEmail(Email email, string mailbox)
{
       Mailbox box = client.AllMailboxes[mailbox];
       box.UidDeleteMessage(email.Uid, true);
}

static void Main()
{
    List<Email> emails = GetEmails("inbox");
    emails = emails.Where(email => email.Sent < DateTime.Now.AddHours(-hours))
    foreach (Email email in emails)
         DeleteEmail(email);
}
Run Code Online (Sandbox Code Playgroud)