在dify工作流中需用python代码节点调用zipfile生成zip包并存路径至zip_path,再通过smtp节点或http请求节点(form-data)发送邮件附件;文件路径须为沙箱内绝对路径且可读。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在Dify工作流中实现文件自动打包(Zip)并发送邮件,需绕过平台原生节点限制,借助自定义Python代码节点完成压缩逻辑,并通过SMTP节点或API调用触发邮件投递。
准备待压缩的文件路径列表
确保所有待打包文件已上传至Dify工作流上下文,且路径明确可访问。推荐将文件以绝对路径形式存入变量如 file_paths,类型为字符串数组,例如 ["/mnt/data/report.pdf", "/mnt/data/config.json"]。
若文件来自用户上传,需先用「获取用户输入」节点提取 files 字段,再用「代码节点」遍历生成路径列表;【路径必须为Dify沙箱内真实可读路径,相对路径如 "./data.txt" 会报错】。
用Python代码节点执行Zip打包
添加一个「Python代码」节点,在代码区填入以下内容:
```python
import zipfile
import os
import tempfile
# 从上下文读取文件路径列表
file_paths = context.get("file_paths", [])
# 检查路径是否存在且可读
valid_files = [p for p in file_paths if os.path.isfile(p)]
if not valid_files:
raise ValueError("无有效文件可压缩")
# 创建临时zip文件
temp_zip = tempfile.NamedTemporaryFile(delete=False, suffix=".zip")
temp_zip.close()
# 打包
with zipfile.ZipFile(temp_zip.name, "w", zipfile.ZIP_DEFLATED) as zf:
for fp in valid_files:
# 使用文件名作为归档内路径,避免绝对路径结构
arcname = os.path.basename(fp)
zf.write(fp, arcname)
# 将zip文件路径写回上下文供后续节点使用
context["zip_path"] = temp_zip.name
```
这一步会生成一个临时ZIP文件,并把其完整路径存入 zip_path 变量。注意:Dify沙箱不支持 shutil.make_archive 的某些参数,必须用 zipfile.ZipFile 显式控制。
配置邮件发送节点
方法一:使用内置「发送邮件」节点(需提前在Dify后台配置SMTP服务)
将「发送邮件」节点的「附件」字段设为 {{ zip_path }},主题与正文按需填写。该节点会自动读取路径对应文件并作为附件嵌入。
方法二:调用外部邮件API(如SendGrid、Mailgun)
新增一个「HTTP请求」节点,Method选 POST,URL填API端点;Headers中加入认证信息;Body选择 form-data,添加字段 to、subject,再添加 attachment 字段,值设为 {{ zip_path }}。Dify会自动将该路径文件读取为二进制并附在表单中。
【若用方法二,务必确认目标API支持 multipart/form-data 方式上传文件,否则附件将为空】











