如何通过C#的MimeKit包区分.eml文件中的已发送/接收邮件?
如何通过MimeKit的MimeMessage区分已发送/已接收邮件
.eml文件本身没有内置的“已发送/已接收”状态标记,需要通过邮件头字段、收发件人角色来推断,以下是几种可靠的判断方式:
1. 基于目标邮箱的收发角色判断
如果你的程序针对特定邮箱账户处理邮件,可以通过目标邮箱在邮件中的角色区分:
- 已发送邮件:目标邮箱出现在
From(发件人)或Sender(实际发送人,适配代理发送场景)列表中 - 已接收邮件:目标邮箱出现在
To(收件人)、Cc(抄送)或Bcc(密送)列表中
代码示例:
// 传入目标邮箱地址与MimeMessage对象 private static bool IsSentMessage(MimeMessage message, string targetEmail) { // 检查发件人是否包含目标邮箱 if (message.From.Any(addr => addr.Address.Equals(targetEmail, StringComparison.OrdinalIgnoreCase))) return true; // 检查代理发送场景下的实际发送人 if (message.Sender != null && message.Sender.Address.Equals(targetEmail, StringComparison.OrdinalIgnoreCase)) return true; // 检查是否属于收件方,是则为已接收邮件 var recipientAddresses = message.To.Concat(message.Cc).Concat(message.Bcc) .Where(addr => addr != null) .Select(addr => addr.Address); return !recipientAddresses.Any(addr => addr.Equals(targetEmail, StringComparison.OrdinalIgnoreCase)); }
2. 利用邮件客户端自定义头字段
部分邮件客户端会添加专属头字段标记邮件状态,常见的有:
- Outlook/Exchange:已发送邮件通常携带
X-MS-Exchange-Organization-AuthAs: Sender头字段 - Thunderbird:已发送邮件的
X-Mozilla-Status字段会包含特定值(如0x00010000) - 通用场景:
Return-Path字段若与发件人地址一致,大概率是已发送邮件(已接收邮件的Return-Path通常为发件方邮箱)
示例代码(通过Return-Path判断):
private static bool IsSentByReturnPath(MimeMessage message) { var returnPath = message.ReturnPath?.Address; var senderAddress = message.From.FirstOrDefault()?.Address ?? message.Sender?.Address; if (string.IsNullOrEmpty(returnPath) || string.IsNullOrEmpty(senderAddress)) return false; return returnPath.Equals(senderAddress, StringComparison.OrdinalIgnoreCase); }
3. 辅助判断:回复/引用关系
已发送邮件如果是回复他人的,In-Reply-To或References字段会包含原始邮件的Message-ID,但该方式仅作为辅助依据,不能单独判断(已接收邮件也可能是回复你的邮件)。
注意事项
- 没有100%通用的判断逻辑,不同邮件客户端/服务器的头字段差异较大,建议结合多种方式提升准确率
- 若处理本地导出的.eml文件(如从Outlook的“已发送邮件”或“收件箱”导出),可结合文件所在文件夹路径辅助判断(如果路径信息可用)
内容的提问来源于stack exchange,提问作者AlirezaEiji
相关产品推荐
相关产品推荐

