如何修改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
相关产品推荐
相关产品推荐

