如何通过Python从Gmail下载并保存JSON格式附件?
解决Gmail IMAP下载JSON附件到本地的问题
你已经成功定位到JSON格式的附件,只需要在匹配到application/json的分支里添加文件读取和保存的逻辑即可。以下是修改后的完整代码:
# based on Python example from codingforentrepreneurs import imaplib import email # 补充导入email模块,原代码遗漏了这个 import os host = 'imap.gmail.com' def get_inbox(tempList): mail = imaplib.IMAP4_SSL(host) mail.login(tempList[0], tempList[2]) mail.select("inbox") _, search_data = mail.search(None, 'UNSEEN') my_message = [] # 定义保存附件的本地目录,不存在则创建 save_dir = "./gmail_json_attachments" os.makedirs(save_dir, exist_ok=True) for num in search_data[0].split(): email_data = {} _, data = mail.fetch(num, '(RFC822)') _, b = data[0] email_message = email.message_from_bytes(b) # 记录邮件主题,方便对应附件来源 email_data['subject'] = email_message['subject'] email_data['saved_attachments'] = [] for part in email_message.walk(): if part.get_content_type() == "application/json": # 获取附件原始文件名,若无则生成带邮件编号的默认名 filename = part.get_filename() or f"email_{num}_attachment.json" save_path = os.path.join(save_dir, filename) # 解码附件内容并写入本地文件 with open(save_path, 'wb') as f: f.write(part.get_payload(decode=True)) email_data['saved_attachments'].append(save_path) print(f"已保存JSON附件到: {save_path}") my_message.append(email_data) return my_message
关键修改说明:
- 补充
email模块导入:原代码使用email.message_from_bytes但未导入模块,会导致运行报错。 - 自动创建保存目录:用
os.makedirs确保目标目录存在,避免路径不存在的写入错误。 - 处理附件文件名:优先使用邮件里的原始文件名,无文件名时生成唯一默认名,避免文件覆盖。
- 解码并保存内容:
part.get_payload(decode=True)会自动处理邮件的编码格式(如base64),还原原始JSON字节内容,再以二进制模式写入本地。 - 记录保存路径:将每个邮件的附件保存路径存入
email_data,方便后续追踪附件来源。
注意事项:
- Gmail登录需使用应用专用密码:若账号开启两步验证,不能直接用普通密码登录,需在Google账号设置中生成应用专用密码。
- 权限检查:确保脚本有写入目标目录的权限。
内容的提问来源于stack exchange,提问作者karasu671
相关产品推荐
相关产品推荐

