我正在使用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的循环的建议的问题是计数器索引将不与消息索引同步,因为在我的情况下,我正在搜索仅检索特定的消息子集(据我所知) .
谢谢.
您可以尝试通过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)
| 归档时间: |
|
| 查看次数: |
7190 次 |
| 最近记录: |