MailKit 4.3.0删除邮件遇FolderNotOpenException,求解决方案
解决MailKit 4.3.0删除邮件时的FolderNotOpenException问题
问题原因
你的代码仅检查了文件夹是否打开(IsOpen),但未验证当前的访问权限是否为读写模式。如果Inbox之前是以只读模式打开的,IsOpen会返回true,但执行AddFlags这类需要写权限的操作时就会抛出FolderNotOpenException。另外,IsWritable属性在MailKit 4.3.0版本中已被移除,无法使用。
解决方案
通过Inbox.Access属性判断当前文件夹的访问权限,确保以读写模式打开后再执行删除操作。同时,建议记录文件夹的初始状态,避免关闭原本就处于打开状态的文件夹:
// 记录文件夹初始状态,避免误关原本打开的文件夹 var wasPreviouslyOpen = Inbox.IsOpen; var needsReopen = !wasPreviouslyOpen || Inbox.Access != FolderAccess.ReadWrite; try { if (needsReopen) { // 如果未打开或当前是只读模式,以读写模式打开 Inbox.Open(FolderAccess.ReadWrite); } // 执行删除操作 Inbox.AddFlags(uid, MessageFlags.Deleted, true); Inbox.Expunge(); } catch (Exception ex) { Console.WriteLine($"删除UID为{uid}的邮件出错: {ex.Message}"); } finally { // 仅关闭我们自己打开的文件夹 if (!wasPreviouslyOpen && Inbox.IsOpen) { Inbox.Close(); } }
额外说明
FolderAccess枚举包含ReadOnly、ReadWrite和AppendOnly三种模式,删除操作必须在ReadWrite模式下执行。Expunge()方法会永久移除标记为Deleted的邮件,若想保留邮件在垃圾箱而非永久删除,可跳过此步骤(取决于邮件服务器的配置)。
内容的提问来源于stack exchange,提问作者Matías Alejandro Novillo
相关产品推荐
相关产品推荐

