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

如何修改Python邮件代码,指定非脚本目录的附件路径?

解决Python邮件附件路径问题:访问子目录文件

嘿,这个问题很好解决!你只需要调整附件的路径指定方式,就能轻松访问testdir/testfiles里的文件了,我给你两种靠谱的方案:

方案1:直接使用相对路径

因为你的脚本放在testdir目录,而附件在它的子目录testfiles里,所以直接用相对路径就能定位到文件。比如原来的代码里你可能是这样写附件文件名的:

filename = "example.txt"

只需要改成:

filename = "testfiles/example.txt"  # 或者写成 "./testfiles/example.txt",效果一样

这个路径是相对于脚本运行的目录(也就是testdir)来查找的,所以能准确找到子目录里的文件。

方案2:使用绝对路径(更稳妥)

如果担心脚本运行时的工作目录发生变化(比如从其他目录启动脚本),那用绝对路径会更可靠。我们可以先获取脚本所在的绝对目录,再拼接子目录和文件名:

import os  # 记得先导入os模块

# 获取当前脚本的绝对目录路径
script_dir = os.path.dirname(os.path.abspath(__file__))
# 拼接出附件的完整绝对路径
attachment_path = os.path.join(script_dir, "testfiles", "example.txt")

之后在读取附件的时候,用这个attachment_path代替原来的文件名就可以了。

修改后的完整代码示例

我把关键修改部分标出来了,你可以参考:

import smtplib
import os  # 新增导入os模块
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email import encoders

# 初始化邮件对象
msg = MIMEMultipart()
msg['From'] = "你的邮箱地址"
msg['To'] = "收件人邮箱地址"
msg['Subject'] = "带子目录附件的测试邮件"

# 添加邮件正文
body = "这是包含testfiles目录附件的邮件"
msg.attach(MIMEText(body, 'plain'))

# --- 关键修改区域 ---
# 方案1:相对路径
# filename = "testfiles/你要发送的文件.pdf"
# 方案2:绝对路径(推荐)
script_dir = os.path.dirname(os.path.abspath(__file__))
filename = os.path.join(script_dir, "testfiles", "你要发送的文件.pdf")
# --- 关键修改结束 ---

# 读取附件并添加到邮件
with open(filename, "rb") as attachment:
    part = MIMEBase('application', 'octet-stream')
    part.set_payload(attachment.read())

encoders.encode_base64(part)
# 这里用os.path.basename获取文件名,避免附件名带路径
part.add_header('Content-Disposition', f"attachment; filename= {os.path.basename(filename)}")

msg.attach(part)

# 发送邮件(这部分和你原来的代码一致)
server = smtplib.SMTP('你的SMTP服务器地址', 587)
server.starttls()
server.login("你的邮箱地址", "邮箱授权码")
text = msg.as_string()
server.sendmail("你的邮箱地址", "收件人邮箱地址", text)
server.quit()

这样修改后,不管你是在testdir目录下运行脚本,还是从其他目录启动,都能正确找到testfiles里的附件啦!

内容的提问来源于stack exchange,提问作者Sum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:08:11