如何使用MailKit库获取电子邮件中自己发送的回复内容
问题解决思路
1. 主题查询遗漏回复的问题
原因:大部分邮件服务会在回复邮件的主题前自动添加Re:(部分语言环境可能是其他前缀),直接用原主题搜索无法匹配带前缀的回复。
解决方案:
- 可以改为匹配主题包含原主题关键词即可,或者使用
SearchQuery.And()组合多个条件,同时匹配带/不带前缀的主题; - 若要匹配整个会话线程,更推荐通过
References、In-Reply-To头关联原始邮件ID,查询同线程所有邮件。
示例代码:
// 模糊匹配主题即可覆盖带Re:前缀的回复 var uidsX = client.Inbox.Search(SearchQuery.SubjectContains("Message's Subject"));
2. Message-ID查询返回空的问题
原因:
HeaderContains是模糊子串匹配,部分IMAP服务器对Message-ID头的搜索要求精确匹配,不支持模糊查询;- 你提供的代码存在变量名笔误,定义的常量是
myReplyId,搜索时传的是不存在的myMessageId。
解决方案:
使用MailKit内置的SearchQuery.MessageId()方法做精确匹配,性能和兼容性都远高于手动查Header:
const string myReplyId = @"<CAAWrOQmJib_RHUn+3vB9GqATim165zq_Upn_8OTatZZMYGtf5w@mail.gmail.com>"; var myReply = client.Inbox.Search(SearchQuery.MessageId(myReplyId));
3. 已发送文件夹查询无结果的问题
原因:绝大多数情况是没有正确定位、打开已发送文件夹,直接硬编码文件夹名容易因为语言、服务配置不同匹配失败。
解决方案:
通过IMAP的特殊文件夹枚举定位已发送文件夹,确保打开的是正确的路径:
// 优先通过系统标记的特殊文件夹定位已发送目录 var sentFolder = client.GetFolder(client.PersonalNamespaces[0]) .GetSubfolders() .FirstOrDefault(f => f.SpecialFolder == SpecialFolder.Sent); // 兜底适配Gmail等特殊命名规则的服务 if (sentFolder == null) { sentFolder = client.GetFolder("[Gmail]/Sent Mail"); } // 必须打开文件夹才能执行搜索操作 sentFolder.Open(FolderAccess.ReadOnly); // 搜索已发送文件夹内的对应邮件 var sentReply = sentFolder.Search(SearchQuery.MessageId(myReplyId));
内容的提问来源于stack exchange,提问作者Malek Alhourani
相关产品推荐
相关产品推荐

