Jenkins邮件通知总失败,怎么排查配置问题?

设计师长春 阅读 105

在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插件设置里?

我来解答 赞 5 收藏
二维码
手机扫码查看
2 条解答
书生シ世玉
这种情况我之前也碰到过,确实挺让人头疼的。既然命令行能正常发邮件,说明你的SMTP服务器和网络本身没啥大问题,那大概率是Jenkins这边的配置或者环境有点小毛病。

先说几个常见的排查方向吧:

1. **检查Jenkins运行用户权限**
确保Jenkins服务运行的用户(通常是jenkins)有权限访问网络和SMTP服务。有时候公司防火墙会限制某些用户的外网访问权限。

2. **日志里看具体错误**
报错信息提到Could not connect to SMTP host,你可以仔细看看完整日志,有没有更详细的提示,比如超时、认证失败之类的。如果确实是超时,可能跟网络延迟有关;如果是认证失败,再核对下凭证是不是正确绑定到了credentialsId

3. **试试手动构造邮件发送代码**
我觉得这是个很有效的办法。可以在Jenkins的Groovy控制台里直接跑一段测试代码,绕过插件的设置,看看能不能发出去。比如这样:

import javax.mail.*
import javax.mail.internet.*

def props = new Properties()
props.put("mail.smtp.host", "mail.company.com")
props.put("mail.smtp.port", "587")
props.put("mail.smtp.auth", "true")
props.put("mail.smtp.starttls.enable", "true")

def auth = [
getPasswordAuthentication: {
return new PasswordAuthentication("your-email@company.com", "your-password")
}
] as Authenticator

def session = Session.getInstance(props, auth)
def message = new MimeMessage(session)
message.setFrom(new InternetAddress("from-email@company.com"))
message.addRecipient(Message.RecipientType.TO, new InternetAddress("to-email@company.com"))
message.setSubject("Test Subject")
message.setText("Test Body")

Transport.send(message)


如果这段代码能成功发邮件,那就说明Jenkins本身的Java Mail配置没问题,可能是插件那边的参数没对齐。

4. **防火墙和DNS问题**
你提到偶尔能成功,大部分时候失败,这个表现让我怀疑可能是网络波动或者DNS解析问题。可以试着把mail.company.com换成具体的IP地址再试试,排除DNS解析的影响。另外找你们运维同事确认下,Jenkins服务器所在的网段是否被防火墙特殊处理了。

最后,如果你还是搞不定,可以把完整的日志贴出来,咱们再一起看看还有什么蛛丝马迹。这种问题有时候就是得一点点试,别太着急哈!
点赞 9
2026-02-01 20:15
Newb.青霞
这种情况我也遇到过,公司环境确实容易有各种奇葩问题。先说结论吧,大概率是Jenkins的邮件发送线程被防火墙限制了,或者Exchange服务器对并发连接有限制。

我的做法是这样:

1. 首先确认下Jenkins服务启动时绑定的网络接口是不是有问题。有时候Jenkins跑在内网IP上,但发邮件时需要用外网IP,可以试试把SMTP配置里的主机名换成具体IP试试。

2. 把日志级别调到最细(在系统管理 -> 系统日志里配置),看看具体的报错信息是什么。重点看有没有类似“connection timeout”或者“blocked”这样的提示。

3. 既然命令行能正常发,说明Exchange本身没问题。那你可以试试在Jenkins的jenkins.model.JenkinsLocationConfiguration里手动指定邮件域名,比如mail.company.com

4. 如果还是不行,可以试试用更详细的SMTP配置。像下面这样:

emailext (
to: 'user@company.com',
subject: "Test",
body: "This is a test",
mimeType: 'text/html',
from: 'jenkins@company.com',
replyTo: 'jenkins@company.com',
attachLog: true,
compressLog: true,
attachmentsPattern: '**/*.log',
smtpServer: 'mail.company.com',
smtpPort: '587',
smtpAuth: 'true',
charset: 'UTF-8',
tls: true
)


5. 最后如果都搞不定,可以换个思路,写个简单的脚本通过命令行发邮件,在Jenkins里直接调这个脚本。

说实话,这种问题真是让人头大,但一步步排查总能找到原因。希望这些方法对你有用!
点赞 6
2026-02-01 19:01