如何避免Python发送邮件时泄露文件路径?及耗时异常排查
问题分析与解决方案
附件目录泄露的原因
你的代码中设置附件文件名时直接使用了完整路径变量fatt:
part.add_header('Content-Disposition', 'attachment; filename="'+fatt+'"')
这会导致邮件客户端显示完整的文件路径,而非仅文件名。
os.chdir导致发送变慢的可能原因
切换工作目录后,进程的全局工作路径被修改,可能引发以下问题:
- 如果原文件路径和新工作目录不在同一存储设备(比如不同磁盘分区),文件读取时会产生额外的设备上下文切换开销
- 系统对路径的解析逻辑可能因工作目录变更增加额外的权限检查或路径遍历操作
- 若
fatt在切换目录后变为相对路径,可能触发不必要的路径解析流程,间接增加整体耗时
最优解决方案
无需切换工作目录,直接提取文件名即可解决路径泄露问题,同时避免性能损耗:
- 导入
os模块 - 用
os.path.basename(fatt)获取纯文件名,替换原代码中的fatt
修改后的核心代码如下:
import os import smtplib from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email.utils import formatdate from email import encoders def send_mail(attribute): msg = MIMEMultipart() msg['From'] = send_from msg['To'] = send_to msg['Date'] = formatdate(localtime=True) msg['Subject'] = subject part = MIMEBase('application', "octet-stream") part.set_payload(open(fatt, "rb").read()) encoders.encode_base64(part) # 仅使用文件名而非完整路径 filename = os.path.basename(fatt) part.add_header('Content-Disposition', f'attachment; filename="{filename}"') msg.attach(part) smtp = smtplib.SMTP(server, port) if isTls: smtp.starttls() smtp.login(username, password) smtp.sendmail(send_from, send_to, msg.as_string()) smtp.quit()
这种方法直接从完整路径中剥离文件名,既解决了路径泄露问题,又不会改变进程的工作目录,完全避免了切换目录带来的性能损耗。
内容的提问来源于stack exchange,提问作者Jirawat Kusolpredee
相关产品推荐
相关产品推荐

