2026-10-07 · 原文发布日
订阅欢迎信与版本发布通知一条龙流程
这个n8n流程把newsletter订阅管理和发版通知合在一起:webhook收到邮箱后校验格式、在Data Table查重、存为新订阅者并发HTML欢迎信;发版时从GitHub README提取指定版本的changelog,过滤内部维护类条目后,可选交给OpenAI生成主题、导语和亮点文案,AI失败则回退到确定性模板直接拼装,最后经SMTP逐个群发并附短暂延时。含语义化版本号和SEND_EMAIL=YES双重发送保险。
原文要点
原模板为Paolo Ronco发布的免费n8n工作流:订阅webhook接收并小写化邮箱、校验格式、查Data Table防重复、发HTML欢迎信;发版支持手动或生产webhook触发,必须提供合法语义化版本号且SEND_EMAIL恰为YES才放行;可从GitHub README按版本号抽取changelog或用手工提供的changelog,过滤内部维护类条目;可选OpenAI结构化输出生成主题、导语、亮点与收尾,失败则用确定性模板拼装;随后循环读取全部订阅者经SMTP逐封发送并加短暂等待,webhook回执包含版本、收件人数与所用生成路径。
这次做成什么
在自有n8n搭建订阅查重与欢迎信流程;发版时必须同时提供合法版本号和SEND_EMAIL=YES,才按README或手工changelog生成通知。先复制工作流并把订阅表限制为本人测试邮箱,再验证发送与回执。
准备什么
- 可访问公网的n8n实例且支持Data Tables功能
- 一组SMTP凭据和已通过验证的发件邮箱地址
- OpenAI API凭据(仅启用AI文案分支时必需)
- Header Auth凭据,用于保护订阅与发版两个webhook
- 一个HTTP可达的GitHub raw README或changelog文件
具体怎么做
导入工作流并建订阅者表
把模板JSON导入n8n,新建一个Data Table(至少含email字段),记下其ID;在所有节点中把REPLACE_WITH_YOUR_NEWSLETTER_DATA_TABLE_ID替换为该ID。
配置凭据与发件信息
为订阅/发版webhook配置Header Auth;在欢迎信与发版信两个邮件节点填入SMTP凭据;把newsletter@example.com换成你的验证发件地址;在Build Welcome Email节点里改产品名、欢迎文案、法律页脚与退订说明。
配置changelog来源
在Read README from GitHub节点把示例raw GitHub地址换成你项目的README或changelog地址;在Extract Requested Release Versions节点内更新示例官网与发版说明URL。
接入OpenAI并测试
复制工作流,用只含本人测试邮箱的独立Data Table,确认Read Subscribers读的就是该表,再接入OpenAI凭据。按模板错误处理设置测试AI文案与确定性兜底;不能只删凭据就假定必然走到兜底节点。
用合成请求激活验证
向测试订阅webhook POST本人邮箱,核对大小写查重与欢迎信。发送测试前再次核对表内只有本人邮箱,再向发版webhook提交合法版本及SEND_EMAIL=YES。检查实际回执中的版本、收件数和生成路径,字段名以模板输出为准。
可直接复制的材料
发版webhook测试请求体(合成)
本站独立编写的测试字段示意;原文确认版本、changelog与SEND_EMAIL语义,字段结构须先与导入模板核对,不能直接向生产端点试发。
{
"versions": ["1.4.0"],
"SEND_EMAIL": "YES",
"changelog": "## 1.4.0\n- 新增:仪表盘支持导出CSV\n- 修复:列表页分页偶发跳页\n- 内部:升级构建脚本依赖"
}AI发版文案提示词(本站示例)
原模板含OpenAI结构化输出分支,但原文未给出提示词全文;此为本站按其描述独立编写的示例,字段名需与原模板structured output的schema核对后再用。
你是产品newsletter编辑。根据以下changelog,输出JSON,字段为subject(不超过30字的邮件主题)、intro(80字内导语,说明本次更新价值)、highlights(数组,仅保留面向用户的条目,每条一句话,忽略内部维护类条目)、closing(一句收尾并引导查看完整发版说明)。语气专业、具体,不夸大。changelog如下:{{ $json.changelog }}订阅测试POST命令(替换占位配置)
本站独立编写的完整请求示例;URL、认证头和值由导入模板的测试webhook配置取得,邮箱换成本人测试地址。占位域名无法真实投递。
export N8N_SUBSCRIPTION_WEBHOOK="https://your-n8n.example.invalid/webhook/subscription-test"
export AUTH_HEADER_NAME="REPLACE_WITH_CONFIGURED_HEADER_NAME"
export AUTH_HEADER_VALUE="REPLACE_WITH_CONFIGURED_TEST_VALUE"
# email必须换成本人实际可收信的测试邮箱;请求会触发欢迎信。
curl --fail-with-body --request POST "$N8N_SUBSCRIPTION_WEBHOOK" \
--header "Content-Type: application/json" \
--header "$AUTH_HEADER_NAME: $AUTH_HEADER_VALUE" \
--data '{"email":"Test.User@example.invalid"}'输入与输出示例
本站合成输入与预期结果,未真实发信;AI故障分支是否成功兜底、实际回执和投递状态须在本人测试邮箱核对。
输入
复制的测试工作流连接只含本人测试邮箱的订阅表;请求合法版本1.4.0、SEND_EMAIL=YES及本站合成changelog:新增CSV导出、修复分页、内部升级构建依赖。具体JSON字段先与模板核对。对应输出
预期本人测试邮箱收到面向用户的发版信,亮点只含CSV导出与分页修复;内部构建依赖被过滤。回执应表达已通知版本1.4.0、实际收件人数1及所用内容生成路径。原文没有给出这些回执的精确字段名,不据此虚构announcedVersions等接口。做完检查这些
- 重复POST同一邮箱(大小写不同)时,Data Table只新增一行且只发一次欢迎信
- POST缺少合法语义化版本号或SEND_EMAIL不是YES时,流程在硬校验处停止、不发送任何邮件
- 在复制工作流按原模板的错误处理方式模拟AI分支失败,确认进入兜底且只向本人测试邮箱发送
- README中能按请求版本号只抽取对应小节,不混入其他版本内容
- 核对Wait间隔、实际回执与本人收到的邮件;默认查询全部行,测试表必须只含本人邮箱
容易卡住的地方
- 模板内的产品名、域名、发件地址、法律文案全是占位示例,漏替换会把example.com发到真实用户
- 默认订阅查询返回Data Table全部行;自行加退订功能后必须同步改Read Subscribers的过滤条件
- README抽取依赖语义化版本格式,项目用其它版本格式时需扩展抽取逻辑
- SMTP服务商有发送频率限制时,Wait间隔不足可能触发退信或封号
- 真实收集邮箱涉及隐私与营销合规,上线前需确认同意与退订机制
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Send newsletter welcomes and release announcements with GitHub, OpenAI and SMTP
- 原作者
- Paolo Ronco
- 原始发布日期
- 2026-10-07T14:01:46.663Z
- 来源
- https://n8n.io/workflows/20636