邮件正文图片干扰附件识别,求改Zip+CSV提取脚本
解决邮件附件识别异常的靠谱方案
嘿,这个思路其实有坑——只取第一个附件不一定能稳拿你要的Zip文件,因为邮件里的附件顺序可不是固定的!很多邮件客户端会把正文里的内嵌图片(就是那些被识别成“额外附件”的家伙)排在真实附件前面,这时候你取第一个就拿到图片了,脚本照样炸。
更稳妥的做法是精准筛选目标Zip附件,而不是依赖附件顺序,这里给你两个核心判断维度:
- 检查附件的文件名后缀:只保留后缀为
.zip的文件(注意兼容大小写,比如.ZIP) - 区分内嵌资源和真实附件:内嵌图片通常带有
Content-Disposition: inline标记,而你要的Zip附件应该是Content-Disposition: attachment,可以通过这个属性过滤掉内嵌图
假设你用Python的email模块处理邮件,这里给你一段示例代码,帮你精准定位Zip附件:
import email from email.policy import default def extract_target_zip(email_msg): # 遍历邮件所有部分,筛选符合条件的Zip附件 for part in email_msg.walk(): # 跳过非附件类型的内容 if part.get_content_disposition() not in ("attachment", "inline"): continue # 获取附件文件名 filename = part.get_filename() if not filename: continue # 检查文件名是否为Zip格式(兼容大小写) if filename.lower().endswith(".zip"): # 额外验证MIME类型,进一步确保是Zip文件 content_type = part.get_content_type() if content_type in ("application/zip", "application/x-zip-compressed"): # 只保留真实附件,排除内嵌图片 if part.get_content_disposition() == "attachment": return part return None # 解析本地邮件文件(你可以替换成从邮件服务器拉取的逻辑) with open("your_email.eml", "rb") as f: msg = email.message_from_binary_file(f, policy=default()) # 获取目标Zip附件 target_zip = extract_target_zip(msg) if target_zip: # 保存Zip文件到本地 with open(target_zip.get_filename(), "wb") as f: f.write(target_zip.get_payload(decode=True)) print("成功提取Zip附件!") else: print("未找到符合要求的Zip附件")
这段代码的优势在于:
- 不依赖附件顺序,不管内嵌图片排在哪,都能精准找到你要的Zip
- 双重验证(文件名+MIME类型),避免把其他后缀相似的文件当成Zip
- 排除了
inline类型的内嵌资源,彻底解决正文图片干扰的问题
如果你的脚本用的是其他语言/库,核心逻辑也是一样的:通过文件名、MIME类型、Content-Disposition来筛选,而不是依赖附件的位置顺序。
内容的提问来源于stack exchange,提问作者Nick Knauer
相关产品推荐
相关产品推荐

