核心是安装Email Extension插件并配置post块逻辑:先在系统管理中安装插件、设置SMTP(如smtp.qq.com:465)、验证测试邮件;再在Jenkinsfile的post段用emailext按success/failure等状态发送HTML邮件,支持动态收件人与外部模板。

Jenkins 配置邮件通知流水线执行结果,核心是两步:装对插件 + 写对 post 段逻辑。系统自带的邮件功能太简陋,必须用 Email Extension Plugin 才能发 HTML 格式、带链接、按状态区分的邮件。
安装并配置 Email Extension 插件
进入 Jenkins → 系统管理 → 插件管理 → 可选插件,搜索 Email Extension Plugin 并安装(重启 Jenkins 后生效)。安装完后,进入 系统管理 → 系统设置,向下滚动找到 Extended E-mail Notification 区域:
- SMTP 服务器地址填你邮箱服务商的 SMTP 地址(如 QQ 邮箱填
smtp.qq.com,163 填smtp.163.com) - 端口一般为
465(启用 SSL)或587(启用 TLS),QQ/163/腾讯企业邮箱都推荐用 465 + SSL - 用户名填你的完整邮箱地址,密码填邮箱授权码(不是登录密码!需在邮箱网页端开启 SMTP 并生成)
- 系统管理员邮件地址要和上面用户名一致,否则发信失败
- 拉到最下方点 Test configuration,输入测试收件人邮箱,确认能收到测试邮件
在 Pipeline 脚本中定义 post 通知逻辑
邮件发送动作写在 pipeline 的 post 块里,按构建状态触发。下面是最常用、最清晰的写法:
-
成功时发 HTML 邮件:用
emailext指令,主题含项目名和编号,正文中嵌入关键链接(控制台日志、构建页、项目页) -
失败时单独通知:主题标“失败”,正文可加失败原因(
${BUILD_CAUSE})、错误日志片段(需配合archiveArtifacts或脚本提取) - unstable(不稳)和 changed(状态变更)也建议保留,避免漏掉测试失败但未中断构建的情况
示例 post 段(可直接复制进 Jenkinsfile):
post {
always {
script {
echo "构建流程已结束"
}
}
success {
emailext (
subject: "SUCCESS: ${env.JOB_NAME} [${env.BUILD_NUMBER}]",
body: """<h2>✅ 构建成功</h2>
<p><strong>项目:</strong>${env.JOB_NAME}</p>
<p><strong>构建编号:</strong>${env.BUILD_NUMBER}</p>
<p><strong>触发原因:</strong>${env.CAUSE}</p>
<p><strong>构建地址:</strong><a href="https://www.php.cn/link/4d943353921b74e69c7295875e363014">https://www.php.cn/link/4d943353921b74e69c7295875e363014</a></p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill2790" title="Jenkins"><img
src="https://img.php.cn/upload/skill/000/000/081/178936589133238.jpg" alt="Jenkins" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill2790" title="Jenkins">Jenkins</a>
<p>通过 REST API 与 Jenkins CI/CD 服务器交互。适用于触发构建、查询状态、查看控制台输出、管理任务或监控 Jenkins...</p>
</div>
<a href="/xiazai/skill2790" title="Jenkins" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div>
<p><strong>控制台日志:</strong><a href="https://www.php.cn/link/4d943353921b74e69c7295875e363014console">https://www.php.cn/link/4d943353921b74e69c7295875e363014console</a></p>
""",
recipientProviders: [[$class: 'DevelopersRecipientProvider']],
to: 'team@example.com',
mimeType: 'text/html'
)
}
failure {
emailext (
subject: "FAILED: ${env.JOB_NAME} [${env.BUILD_NUMBER}]",
body: """<h2>❌ 构建失败</h2>
<p><strong>项目:</strong>${env.JOB_NAME}</p>
<p><strong>构建编号:</strong>${env.BUILD_NUMBER}</p>
<p><strong>失败时间:</strong>${env.BUILD_TIMESTAMP}</p>
<p><strong>控制台日志:</strong><a href="https://www.php.cn/link/4d943353921b74e69c7295875e363014console">https://www.php.cn/link/4d943353921b74e69c7295875e363014console</a></p>
""",
to: 'devops@example.com',
mimeType: 'text/html'
)
}
}
收件人与模板可灵活控制
不用硬编码邮箱,更推荐用变量或策略动态指定收件人:
- 用
recipientProviders自动取提交者邮箱(DevelopersRecipientProvider)或上次构建失败责任人(RequesterRecipientProvider) - 把 HTML 模板抽成独立文件(如
email-template.html),放在 Jenkins 共享库或 job 工作区,用readFileFromWorkspace加载,便于统一维护 - 模板里支持所有 Jenkins 环境变量:
${BUILD_STATUS}、${PROJECT_URL}、${FAILED_TESTS}(需配合 JUnit 插件)等
常见卡点排查
邮件发不出?优先检查这三项:
- SMTP 授权码是否过期(尤其 163/QQ 邮箱,授权码常半年一换)
- Jenkins 日志(
Manage Jenkins → System Log → All Logs)里有没有javax.mail.AuthenticationFailedException或连接超时报错 - Pipeline 脚本里是否误用了
mail(旧版内置指令),而没用emailext(Email Extension 插件指令)

















