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

如何在C# WPF中程序化下载指定邮箱的所有邮件附件?

在C#中编程下载邮箱附件的实现方案

当然可以实现!你已经用Pop3Client搭好了基础框架,只需要扩展处理附件的逻辑就行,我帮你完善代码并说明关键细节:

首先准备依赖

你当前的代码用到了Pop3Client,推荐使用MailKit库(功能更完善且维护活跃),需要先通过NuGet安装MailKit和MimeKit两个包。

完善后的代码示例

using MailKit.Net.Pop3;
using MimeKit;
using System.IO;
using System.Windows.Forms; // 适配WinForms的ListBox组件

var client = new Pop3Client();
try
{
    // 连接Gmail的POP3服务器
    client.Connect("pop.gmail.com", 995, true);
    // 认证提示:如果账号开启了两步验证,要用Google的应用专用密码,不是普通邮箱密码
    client.Authenticate("your-email@gmail.com", "your-app-password");

    int messageCount = client.GetMessageCount();
    // 自定义附件保存路径,记得替换成你自己的目标路径
    string saveFolder = @"C:\DownloadedEmailAttachments";
    // 确保保存文件夹存在,不存在则自动创建
    Directory.CreateDirectory(saveFolder);

    for (int i = 1; i <= messageCount; i++)
    {
        var message = client.GetMessage(i);
        // 把邮件主题添加到ListBox展示
        ListBox.Items.Add($"邮件主题:{message.Headers.Subject}");

        // 遍历邮件中的所有附件
        foreach (var attachment in message.Attachments)
        {
            // 过滤内嵌资源(比如邮件签名图),只保留真正的用户附件
            if (attachment is MimePart attachmentPart && !string.IsNullOrEmpty(attachmentPart.FileName))
            {
                // 拼接附件的本地保存路径
                string savePath = Path.Combine(saveFolder, attachmentPart.FileName);

                // 处理文件名重复:如果文件已存在,添加时间戳后缀避免覆盖
                if (File.Exists(savePath))
                {
                    string fileNameWithoutExt = Path.GetFileNameWithoutExtension(attachmentPart.FileName);
                    string fileExt = Path.GetExtension(attachmentPart.FileName);
                    savePath = Path.Combine(saveFolder, $"{fileNameWithoutExt}_{DateTime.Now:yyyyMMddHHmmss}{fileExt}");
                }

                // 将附件内容解码并写入本地文件
                using (var fileStream = File.Create(savePath))
                {
                    attachmentPart.Content.DecodeTo(fileStream);
                }

                // 把保存成功的信息添加到ListBox
                ListBox.Items.Add($"✅ 已保存附件:{attachmentPart.FileName}");
            }
        }
    }
}
catch (Exception ex)
{
    // 捕获异常并显示,方便排查问题
    ListBox.Items.Add($"❌ 出错了:{ex.Message}");
}
finally
{
    // 无论成功失败,都要确保断开连接并释放资源
    if (client.IsConnected)
    {
        client.Disconnect(true);
    }
    client.Dispose();
}

关键注意事项

  • Gmail特殊配置:
    • 必须在Gmail设置中启用POP3服务(路径:设置 → 转发和POP/IMAP → POP下载 → 选择“启用POP3”)
    • 如果账号开启了两步验证,不能用普通邮箱密码,需要去Google账号安全设置里创建一个「应用专用密码」来替代
  • 附件过滤技巧:邮件中的内嵌图片(比如签名图)会被归类到Attachments集合,通过判断MimePart类型和FileName是否为空,可以精准过滤出用户上传的附件
  • 健壮性保障:网络波动、认证失败、文件写入权限不足都可能抛出异常,try-catch-finally块能确保程序稳定运行,避免资源泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:13:45