C#使用MailKit每5秒轮询收件箱,空箱时触发ArgumentOutOfRangeException报错
问题原因
- 报错的核心触发逻辑是当收件箱为空时,
inbox.Count值为0,你调用inbox.GetMessage(inbox.Count - 1)实际传入的索引是-1,完全超出合法索引范围(合法索引范围是0 ~ Count-1,Count为0时没有合法索引),所以直接抛出System.ArgumentOutOfRangeException: 指定的参数超出有效值范围。(参数“index”)错误 - 另外你原有代码的判断逻辑存在语法错误:
if(DATA != null);末尾多了分号,导致if判断和后续的大括号代码块完全脱节,不管条件是否成立,大括号内的代码都会执行,完全起不到拦截作用
修复后代码
using (var client = new ImapClient()) { client.Connect(EXT_IMAP_SERVER, EXT_IMAP_PORT, true); client.Authenticate(EXT_USERNAME, EXT_PASSWORD); var inbox = client.Inbox; inbox.Open(FolderAccess.ReadWrite); // 先判断收件箱是否有邮件,没有就直接跳过后续逻辑 if (inbox.Count > 0) { var LAST_MSG = inbox.GetMessage(inbox.Count - 1); DATA = LAST_MSG.Subject; if (DATA != null) { inbox.AddFlags(inbox.Count - 1, MessageFlags.Deleted, true); } } client.Disconnect(true); }
改动说明
- 新增收件箱非空判断:在读取邮件前先校验
inbox.Count > 0,为空时直接跳过所有邮件读写逻辑,避免传入非法索引 - 移除了if判断末尾多余的分号,保证条件判断和后续执行逻辑的绑定关系生效
- 把邮件读取、主题判断、标记删除的逻辑都收拢到非空判断的分支内,完全规避空收件箱场景下的非法操作
内容的提问来源于stack exchange,提问作者Ali Kazemi
相关产品推荐
相关产品推荐

