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

Gmail邮箱遍历与附件批量下载问题:代码仅下载单个附件求助

嘿,我来帮你拆解下这个问题,顺便给你修正代码~

为什么代码只下载一个附件?

主要是两个原因导致的:

1. 判断条件过于严格,直接遗漏了大部分附件

你的代码里if part.get('Content-Disposition') is None: continue这个判断会跳过所有没有Content-Disposition头的附件,但实际邮件里的附件不一定都带这个头:

  • 有些附件的文件名是通过Content-Type里的name参数指定的,这时候part.get_filename()能拿到文件名,但Content-Disposition可能为None,直接被跳过了。
  • 还有些邮件会把附件标记为inline(比如嵌入的图片,但用户可能也需要下载这类内容),同样会被这个判断过滤掉。

2. 返回值逻辑有问题(不影响下载,但不符合需求)

函数最后return att_path,但这个变量是循环里每次覆盖赋值的,所以只会返回最后一个附件的路径,而不是所有已下载附件的列表。


修正后的代码(支持批量下载所有附件)

我调整了判断逻辑,优化了文件名获取方式,同时收集所有下载路径:

import os

def save_attachments(self, msg, download_folder="/tmp"):
    downloaded_attachments = []
    for part in msg.walk():
        # 跳过multipart容器类型(它们是包裹内容的壳,不是实际附件)
        if part.get_content_maintype() == 'multipart':
            continue
        
        # 多渠道获取文件名,避免遗漏
        filename = part.get_filename()
        if not filename:
            # 尝试从Content-Type的name参数提取文件名
            content_type = part.get('Content-Type', '')
            if 'name=' in content_type:
                filename = content_type.split('name=')[1].strip('"')
            else:
                # 实在没有文件名就生成一个默认名
                ext = part.get_content_subtype()
                filename = f"unknown_attachment_{id(part)}.{ext}"
        
        # 处理文件名里的特殊字符(避免路径错误)
        filename = os.path.basename(filename)
        att_path = os.path.join(download_folder, filename)
        
        # 保存文件,用with语句自动关闭文件句柄
        try:
            with open(att_path, 'wb') as fp:
                fp.write(part.get_payload(decode=True))
            downloaded_attachments.append(att_path)
            print(f"已下载附件: {filename}")
        except Exception as e:
            print(f"附件 {filename} 下载失败: {str(e)}")
    
    return downloaded_attachments

额外说明

如果你的需求是只下载明确标记为"attachment"的附件(排除嵌入邮件的inline内容),可以在跳过multipart之后加个判断:

disposition = part.get('Content-Disposition', '')
if not disposition.lower().startswith('attachment'):
    continue

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:22:48