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

如何修复Python下载Gmail附件时的OSError: [Errno 22]无效参数错误

解决OSError: [Errno 22] Invalid argument问题(Gmail附件下载脚本)

问题原因

脚本报错的核心原因是附件文件名本身包含完整Windows路径(比如C:\SOMETHING\SOMETHING.DBF),和下载文件夹C:\UserData\USER\FOLDER\FOLDER拼接后,生成了C:\UserData\USER\FOLDER\FOLDER/C:\SOMETHING\SOMETHING.DBF这种违反Windows路径规则的无效字符串,系统无法识别该路径,因此抛出OSError: [Errno 22] Invalid argument。

解决方案

只需要从带路径的附件名中提取纯文件名(即路径最后一个反斜杠后的部分),再和下载文件夹安全拼接即可。使用Python标准库os.path的工具函数可以轻松实现这一点,还能自动适配系统路径分隔符。

修改后的完整脚本

import os
import traceback

from imbox import Imbox 

host = "imap.gmail.com"
username = "USER1@gmail.com"
password = 'PASSWORD'
download_folder = r'C:\UserData\USER\FOLDER\FOLDER'

if not os.path.isdir(download_folder):
    os.makedirs(download_folder, exist_ok=True)
    
mail = Imbox(host, username=username, password=password, ssl=True, ssl_context=None, starttls=False)
messages = mail.messages(unread=True, sent_from='USER2@gmail.com')


for (uid, message) in messages:
    mail.mark_seen(uid) # 可选:标记邮件为已读

    for idx, attachment in enumerate(message.attachments):
        try:
            att_full_path = attachment.get('filename')
            # 提取纯文件名,剥离前面的路径部分
            att_fn = os.path.basename(att_full_path)
            # 用os.path.join安全拼接路径,自动适配系统分隔符
            download_path = os.path.join(download_folder, att_fn)
            print(download_path)
            with open(download_path, "wb") as fp:
                fp.write(attachment.get('content').read())
        except Exception as e:
            print(f"处理附件出错: {e}")
            traceback.print_exc()

mail.logout()

关键改动说明

  1. 提取纯文件名:os.path.basename(att_full_path)会自动截断路径前缀,比如输入C:\SOMETHING\SOMETHING.DBF会返回SOMETHING.DBF。
  2. 安全路径拼接:os.path.join()替代字符串格式化拼接,会根据当前系统自动选择正确的路径分隔符(Windows下用\),避免出现混合分隔符的问题。
  3. 异常处理优化:将except:改为except Exception as e:,精准捕获异常并打印具体错误信息,便于调试排查。

内容的提问来源于stack exchange,提问作者Jan Přívětivý

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:11:54