Jenkins配置邮件通知后构建失败也没收到告警邮件怎么办?

设计师晓英 阅读 48

我给React项目配置了Jenkins流水线,按网上的教程加了Email Extension插件,填了SMTP服务器信息,测试连接显示成功。但昨天代码报错构建失败后,完全没收到邮件告警,这是哪里出问题了?

const App = () => {
  return (
    <div>
      {process.env.NODE_ENV === 'production' ? 
        <p>部署成功!</p> : 
        <p>开发模式运行中...</p>
      }
    </div>
  );
};

我尝试在Jenkinsfile里加了post失败时的emailext步骤,但控制台只显示”Sending mail…”没后续了。查看Jenkins日志也没报错,邮件服务器防火墙也没拦截记录…

我来解答 赞 12 收藏
二维码
手机扫码查看
2 条解答
公孙晨硕
先确认下几个关键点,这种问题多半是配置细节没到位。复制这个Jenkinsfile片段,替换你原来的post部分:

pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building...'
}
}
}
post {
failure {
emailext (
subject: "构建失败通知 - ${env.JOB_NAME} #${env.BUILD_NUMBER}",
body: """构建失败了!
项目: ${env.JOB_NAME}
构建编号: ${env.BUILD_NUMBER}
构建日志: ${env.BUILD_URL}""",
to: '你的邮箱地址',
from: '发件人邮箱',
mimeType: 'text/plain'
)
}
}
}


有几个地方容易踩坑:第一,emailext的to字段必须写完整邮箱地址,不能只写用户名;第二,检查Jenkins系统设置里的默认收件人是不是空的;第三,SMTP认证密码别写错。

还有个常见问题是触发条件,有时候你以为构建失败了,实际可能是不稳定的构建状态。建议把failure改成always测试下,看能不能收到邮件。

最后,去邮件服务器那边查下发送记录,有时候邮件确实发出去了,但被收件方当成垃圾邮件了。我之前就被坑过好几次,邮件都在垃圾箱里躺着。
点赞 4
2026-02-16 17:18
Mr-兰兰
Mr-兰兰 Lv1
嗯,这个问题挺常见的,Jenkins邮件告警配置失败的原因可能有好几个地方需要排查。咱们一步步来分析一下。

---

### 1. **确认Email Extension插件的配置是否完整**
你提到测试连接成功了,但还需要检查以下几个关键点:

- **Recipient strategy(收件人策略)**:确保你在配置里选择了正确的策略,比如 Developers 或者 Culprits。如果你没选择任何策略,即使构建失败也不会发送邮件。
- **Default Subject 和 Default Content**:这两个字段是必须填写的,默认值会用作邮件主题和内容模板。如果这里留空,可能会导致邮件发送失败。
- **Triggers(触发条件)**:重点来了!你需要明确设置在什么情况下发送邮件。比如 Failure - Any 表示只要构建失败就发邮件,而 Failure - Still Failing 则表示只有连续失败才会发。所以建议先选个最简单的 Always 来测试。

---

### 2. **检查Jenkinsfile中的post步骤**
你说在Jenkinsfile里加了 emailext 步骤,那我看看你的写法是不是有问题。假设你目前的代码类似这样:

post {
failure {
emailext to: 'your-email@example.com',
subject: "Build Failed: ${currentBuild.fullDisplayName}",
body: "The build failed at commit ${env.GIT_COMMIT}. Check logs for more details."
}
}


需要注意以下几点:
- to 字段必须是一个有效的邮箱地址,或者使用 ${ENV, var="EMAIL"} 这样的变量获取用户邮箱。
- 如果你在 Jenkins 的全局配置里设置了默认收件人,这里的 to 可以省略。
- 日志显示 "Sending mail..." 后没有后续,可能是因为邮件服务器确实发出了请求,但被目标邮箱的SMTP网关拦截了(比如被当成垃圾邮件)。你可以尝试换一个更可靠的邮箱地址测试。

---

### 3. **验证邮件服务器的日志**
既然你说邮件服务器防火墙没有拦截记录,那可以进一步检查邮件服务器的日志。大多数邮件服务器都会记录每封邮件的发送状态。比如:
- 如果用的是 Gmail SMTP,可以在 Gmail 的 "Sent" 文件夹里找是否有邮件发出。
- 如果是企业内部的邮件服务器,登录后台查看日志,确认邮件有没有成功投递到目标邮箱。

---

### 4. **测试用脚本排查问题**
有时候直接在 Jenkins 上调试不太方便,可以写个小脚本单独测试邮件发送功能。比如用 Groovy 脚本:

import hudson.tasks.MailSender

def mail = new MailSender("smtp.example.com", 587, true)
mail.setSubject("Test Email from Jenkins")
mail.setContent("This is a test email.", "text/html")
mail.addTo("your-email@example.com")

try {
mail.execute()
println "Email sent successfully!"
} catch (Exception e) {
println "Failed to send email: ${e.message}"
}


把这个脚本保存为 test-mail.groovy,然后通过 Jenkins 的 Script Console 执行。如果这里能正常发送,说明问题是出在流水线配置上;如果还发不出去,可能是 SMTP 配置有问题。

---

### 5. **其他可能的原因**
- **DNS解析问题**:确保 Jenkins 服务器能够正确解析 SMTP 服务器的域名。
- **网络超时**:虽然测试连接成功了,但实际发送邮件时可能会因为网络波动导致超时。可以尝试降低超时时间或者更换更稳定的 SMTP 服务。
- **目标邮箱限制**:有些邮箱会对未知来源的邮件进行屏蔽,特别是来自第三方工具的邮件。可以尝试把目标邮箱换成一个新创建的测试邮箱,看看能不能收到。

---

### 总结
按照上面的步骤逐一排查,基本上就能找到问题所在。我个人猜测最有可能的原因是 **触发条件配置不对** 或者 **邮件被目标邮箱过滤掉了**。如果你试完还是不行,可以把具体的 Jenkins 配置截图贴出来(当然记得打码),或者把完整的 Jenkinsfile 发过来,我再帮你看看。

希望这些能帮到你,加油!
点赞 13
2026-01-29 09:19