You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SmtpClient能否删除已发送邮件?Pop3Client连接报错咨询

问题解答

1. SmtpClient无法删除已发送文件夹的邮件

SmtpClient 仅实现SMTP协议,该协议的核心作用是发送邮件,不具备访问、读取或修改邮箱服务器上各类文件夹(包括「已发送」)的能力。要操作邮箱内的邮件文件夹,需使用支持文件夹操作的协议,比如IMAP或Exchange Web Services(EWS)。

2. 修复Pop3Client连接报错

你遇到的报错翻译为:

无法确定帧大小或接收到损坏的帧

报错根源是混淆了POP3与SMTP的服务地址和端口:

  • Gmail的POP3服务器地址是 pop.gmail.com,而非smtp.gmail.com
  • POP3的SSL端口为995,587是SMTP的TLS端口

此外还需满足以下条件:

  • 在Gmail账户设置中启用POP3服务
  • 若账户开启两步验证,需使用应用专用密码登录,而非原账户密码
  • 密码字段不能留空,必须填写有效密码或应用专用密码

修正后的POP3代码示例:

using var pop3 = new Pop3Client();
pop3.Host = "pop.gmail.com";
pop3.Username = "mohammad.jouhari@gmail.com";
pop3.Password = "你的应用专用密码或账户密码"; // 不可留空
pop3.Port = 995;
pop3.EnableSsl = true;

pop3.Connect();
// 注意:POP3仅能访问「收件箱」,无法操作「已发送」文件夹
pop3.DeleteAllMessages();
pop3.Disconnect(true);

3. 删除「已发送」文件夹邮件的正确方式

要删除「已发送」中的邮件,必须使用IMAP协议(IMAP支持访问邮箱所有文件夹)。以常用的.NET邮件库MailKit为例,代码示例如下:

using MailKit.Net.Imap;
using MailKit.Security;

using var imapClient = new ImapClient();
imapClient.Connect("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect);
imapClient.Authenticate("mohammad.jouhari@gmail.com", "你的应用专用密码或账户密码");

// 打开「已发送」文件夹(Gmail默认命名为"[Gmail]/Sent Mail",中文环境可能为"[Gmail]/已发送")
var sentFolder = imapClient.GetFolder("[Gmail]/Sent Mail");
sentFolder.Open(FolderAccess.ReadWrite);

// 获取所有邮件并标记为删除
var messages = sentFolder.Fetch(0, -1, MessageSummaryItems.UniqueId);
foreach (var message in messages)
{
    sentFolder.AddFlags(message.UniqueId, MessageFlags.Deleted, true);
}

// 永久删除已标记的邮件
sentFolder.Expunge();

imapClient.Disconnect(true);

注意:System.Net.Mail原生类库无IMAP实现,建议通过NuGet安装MailKit这类第三方库完成操作。

内容的提问来源于stack exchange,提问作者user123456

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:20:41