Jenkins邮件通知总失败,怎么排查配置问题?
在Jenkins里配置了邮件通知后,每次构建完成都显示发送失败,但测试连接又说成功了,这是怎么回事啊?
场景是这样的,我在流水线构建成功后要发邮件到公司邮箱,配置了SMTP服务器地址和端口(用的公司提供的Exchange服务),还填了账号密码。测试邮件能收到,但实际构建完成时日志里报错:javax.mail.MessagingException: Could not connect to SMTP host。
已经尝试过把SMTP端口从25改成587,添加了”auth: true”和”starttls: enabled”参数,甚至把重试次数调到3次。但问题还是存在,偶尔能成功但大部分时候失败…
现在怀疑是公司防火墙拦截了?或者Jenkins的邮件资源路径有问题?完全不知道该怎么继续排查了…
"smtp": {
"server": "mail.company.com",
"port": 587,
"credentialsId": "jenkins-mail-cred",
"useSsl": false,
"useStartTls": true
}
用命令行测试的时候:echo "test" | mail -s "subject" user@company.com 却能正常发送,这说明配置问题可能出在Jenkins插件设置里?
先说几个常见的排查方向吧:
1. **检查Jenkins运行用户权限**
确保Jenkins服务运行的用户(通常是
jenkins)有权限访问网络和SMTP服务。有时候公司防火墙会限制某些用户的外网访问权限。2. **日志里看具体错误**
报错信息提到
Could not connect to SMTP host,你可以仔细看看完整日志,有没有更详细的提示,比如超时、认证失败之类的。如果确实是超时,可能跟网络延迟有关;如果是认证失败,再核对下凭证是不是正确绑定到了credentialsId。3. **试试手动构造邮件发送代码**
我觉得这是个很有效的办法。可以在Jenkins的Groovy控制台里直接跑一段测试代码,绕过插件的设置,看看能不能发出去。比如这样:
如果这段代码能成功发邮件,那就说明Jenkins本身的Java Mail配置没问题,可能是插件那边的参数没对齐。
4. **防火墙和DNS问题**
你提到偶尔能成功,大部分时候失败,这个表现让我怀疑可能是网络波动或者DNS解析问题。可以试着把
mail.company.com换成具体的IP地址再试试,排除DNS解析的影响。另外找你们运维同事确认下,Jenkins服务器所在的网段是否被防火墙特殊处理了。最后,如果你还是搞不定,可以把完整的日志贴出来,咱们再一起看看还有什么蛛丝马迹。这种问题有时候就是得一点点试,别太着急哈!
我的做法是这样:
1. 首先确认下Jenkins服务启动时绑定的网络接口是不是有问题。有时候Jenkins跑在内网IP上,但发邮件时需要用外网IP,可以试试把SMTP配置里的主机名换成具体IP试试。
2. 把日志级别调到最细(在系统管理 -> 系统日志里配置),看看具体的报错信息是什么。重点看有没有类似“connection timeout”或者“blocked”这样的提示。
3. 既然命令行能正常发,说明Exchange本身没问题。那你可以试试在Jenkins的
jenkins.model.JenkinsLocationConfiguration里手动指定邮件域名,比如mail.company.com。4. 如果还是不行,可以试试用更详细的SMTP配置。像下面这样:
5. 最后如果都搞不定,可以换个思路,写个简单的脚本通过命令行发邮件,在Jenkins里直接调这个脚本。
说实话,这种问题真是让人头大,但一步步排查总能找到原因。希望这些方法对你有用!