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

如何避免Python发送邮件时泄露文件路径?及耗时异常排查

问题分析与解决方案

附件目录泄露的原因

你的代码中设置附件文件名时直接使用了完整路径变量fatt:

part.add_header('Content-Disposition', 'attachment; filename="'+fatt+'"')

这会导致邮件客户端显示完整的文件路径,而非仅文件名。

os.chdir导致发送变慢的可能原因

切换工作目录后,进程的全局工作路径被修改,可能引发以下问题:

  • 如果原文件路径和新工作目录不在同一存储设备(比如不同磁盘分区),文件读取时会产生额外的设备上下文切换开销
  • 系统对路径的解析逻辑可能因工作目录变更增加额外的权限检查或路径遍历操作
  • 若fatt在切换目录后变为相对路径,可能触发不必要的路径解析流程,间接增加整体耗时

最优解决方案

无需切换工作目录,直接提取文件名即可解决路径泄露问题,同时避免性能损耗:

  1. 导入os模块
  2. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:13:14