应使用 MailKit 的 IMAP 而非 POP3 或 System.Net.Mail 接收邮件,因 IMAP 支持状态同步、按需加载、Idle 长连接及主流邮箱兼容性;配置需严格匹配端口与 SSL 模式,优先 Fetch 摘要再按需获取正文与附件,并复用 ImapClient 实例。

直接用 MailKit + IMAP,别碰 System.Net.Mail 的接收部分——它压根不支持收邮件。
为什么不用 POP3 而选 IMAP
POP3 默认下载即删(delete-after-retrieve 行为),且无法同步已读/标记/文件夹状态;IMAP 支持只拉取邮件头、按需下载正文、保留服务器状态、多设备同步。企业或长期运行的邮件监控服务必须用 IMAP。
- POP3 的
Pop3Client在 MailKit 中存在,但不推荐用于新项目:缺少对 UIDL 持久化、断点续收、并发安全等关键支撑 - IMAP 的
ImapClient支持Idle模式(长连接监听新邮件),避免轮询浪费资源 - Gmail、Outlook.com、腾讯企业邮箱等主流服务商默认关闭 POP3 访问,或要求额外开启“允许不够安全的应用”,而 IMAP 通常只需开启“IMAP 访问”并使用 App Password(非账户密码)
IMAP 连接参数怎么填才不报错
常见错误如 AuthenticationFailedException 或 Connection refused,90% 出在端口和 SSL 模式不匹配。
- 端口与
SecureSocketOptions必须严格对应:
– 端口993→ 用SecureSocketOptions.SslOnConnect
– 端口143→ 用SecureSocketOptions.StartTlsWhenAvailable(先明文握手,再升级 TLS) - Gmail 必须用 App Password(2-Step Verification 开启后生成),不能用账户密码;国内企业邮箱常需绑定 IP 白名单或开启“第三方客户端访问”开关
- 连接前加
client.Timeout = 30000,避免 DNS 解析慢导致无提示卡死
如何安全高效地读取邮件内容
别一上来就调 inbox.GetMessage(i) ——它会下载整封邮件(含附件),内存暴涨且慢。优先用 Fetch 拉摘要,按需加载正文。
- 先用
inbox.Fetch(0, -1, MessageSummaryItems.Full | MessageSummaryItems.BodyStructure)获取结构化摘要,含主题、发件人、时间、是否已读、是否有附件等 - 判断
summary.Body != null再调inbox.GetBodyPart(summary, summary.TextBody)拉纯文本;若需 HTML,则用summary.HtmlBody - 附件要单独处理:
foreach (var part in summary.Attachments),再用inbox.GetBodyPart(summary, part)下载二进制流,别硬塞进MimeMessage全量解析 - 记得用
inbox.AddFlags()标记已处理邮件(如MessageFlags.Seen),否则下次还会被拉出来
实际跑起来最易忽略的三个点
代码能连上、能取到数量、甚至能打印主题,但一处理附件或大邮件就崩——问题往往不在逻辑,而在环境与配置。
- 目标邮箱必须启用 IMAP(Gmail 在「设置 → 转发和 POP/IMAP」里开;腾讯企业邮箱在「邮箱设置 → 客户端设置」里开),不是开了 SMTP 就等于开了 IMAP
- 如果部署在 Linux(如 Docker 容器)中,
MailKit依赖系统 CA 证书链验证 TLS,CentOS/RHEL 需装ca-certificates,Alpine 需加apk add ca-certificates - 不要在循环里反复
new ImapClient()+Connect():连接池没复用,服务器可能限频封 IP;应复用单例 client,用client.IsConnected和ReconnectIfNecessary()维护状态


















