如何为右键选中的多个文件执行单次操作 实现批量附件添加到单封邮件
解决Windows右键自定义菜单多文件选中重复启动问题
问题原因
你遇到的重复启动是Windows右键菜单的默认行为:未做特殊配置的自定义菜单项,选中多个文件时会为每个文件单独启动一次绑定程序,导致你的邮件脚本每次只能拿到1个文件路径,生成多封邮件。
解决方案一:修改注册表适配多文件选中(首选)
该方案可以让系统一次性把所有选中的文件路径传给你的脚本,仅启动一次程序:
- 按下
Win+R输入regedit回车打开注册表编辑器,定位到你之前新增的自定义菜单项路径,通常为HKEY_CLASSES_ROOT\*\shell\你设置的菜单名称 - 在该路径下新建字符串值,名称为
MultiSelectModel,数值数据填写Player,该配置会告知Windows选中多个文件时仅启动一次程序 - 打开该路径下的
command子项,修改默认值的调用命令,格式参考:pythonw.exe "C:\你的脚本完整路径\send_email.py" "%*",其中%*代表接收所有选中文件的路径参数
解决方案二:临时缓存兼容方案
如果注册表修改后不生效,可以用脚本侧的缓存逻辑兼容多实例问题:
- 脚本启动后先检测指定路径的临时缓存文件是否存在,同时判断是否有已运行的同脚本进程
- 若存在已运行进程,就将当前拿到的单个文件路径写入缓存文件后直接退出
- 首个启动的脚本进程等待1-2秒,读取缓存内的所有文件路径,统一添加为附件发送,发送完成后删除临时缓存文件即可
适配多参数的Python脚本示例
import sys import smtplib from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders # 跳过索引0的脚本自身路径,取所有传入的文件路径 file_list = sys.argv[1:] # 配置邮件参数 sender = "你的发件邮箱" auth_code = "你的邮箱授权码" receiver = "你的收件邮箱" smtp_server = "smtp.你的邮箱服务商.com" smtp_port = 465 # 构建邮件 msg = MIMEMultipart() msg["From"] = sender msg["To"] = receiver msg["Subject"] = "右键发送文件合集" # 批量添加附件 for file_path in file_list: with open(file_path, "rb") as f: part = MIMEBase("application", "octet-stream") part.set_payload(f.read()) encoders.encode_base64(part) filename = file_path.split("\\")[-1] part.add_header("Content-Disposition", f"attachment; filename={filename}") msg.attach(part) # 发送邮件 with smtplib.SMTP_SSL(smtp_server, smtp_port) as server: server.login(sender, auth_code) server.sendmail(sender, receiver, msg.as_string())
内容的提问来源于stack exchange,提问作者XZeeno
相关产品推荐
相关产品推荐

