Jenkins SMTP TLS

标签 jenkins jenkins-plugins

我正在尝试将 Jenkins 设置为使用我们公司的 SMTP 服务器通过电子邮件发送构建通知。我们在端口 587 上使用 TLS 作为加密方法。但我似乎无法让电子邮件通知正常工作。

这是我的 Hudson.Tasks.Mailer.xml 文件,因此您可以查看我的配置(我已经删除了 SMTP auth 用户和密码,并稍微更改了 smtpHost 以防万一)

<hudson.tasks.Mailer_-DescriptorImpl>
  <helpRedirect/>
  <defaultSuffix></defaultSuffix>
  <hudsonUrl>http://localhost:8080/</hudsonUrl>
  <smtpAuthUsername></smtpAuthUsername>
  <smtpAuthPassword></smtpAuthPassw$
  <adminAddress></adminAddress>
  <smtpHost>pod#####.outlook.com</smtpHost>
  <useSsl>true</useSsl>
  <smtpPort>587</smtpPort>
  <charset>UTF-8</charset>
</hudson.tasks.Mailer_-DescriptorImpl>

看起来这是一个已知问题,来自 http://issues.hudson-ci.org/browse/HUDSON-2206

我对 Apple OS(这是运行 Jenkins 的机器)不是很熟悉,但我认为我可以使用提到的解决方法解决这个问题。不过,我不确定该解决方法应该放在哪里,所以我试着把它放在这里:
/图书馆/应用程序支持/Jenkins/jenkins-runner.sh
defaults="defaults read /Library/Preferences/org.jenkins-ci"

war=`$defaults war` || war="/Applications/Jenkins/jenkins.war"

javaArgs="-Dmail.smtp.starttls.enable=\"true\""
heapSize=`$defaults heapSize` && javaArgs="$javaArgs -Xmx${heapSize}"
permGen=`$defaults permGen` && javaArgs="$javaArgs -XX:MaxPermSize=${permGen}"

home=`$defaults JENKINS_HOME` && export JENKINS_HOME="$home"

add_to_args() {
  val=`$defaults $1` && args="$args --${1}=${val}"
}

args=""
add_to_args prefix
add_to_args httpPort
add_to_args httpListenAddress
add_to_args httpsPort
add_to_args httpsListenAddress
add_to_args ajp13Port
add_to_args ajp13ListenAddress

echo "JENKINS_HOME=$JENKINS_HOME"
echo "Jenkins command line for execution"
echo /usr/bin/java $javaArgs -jar "$war" $args
exec /usr/bin/java $javaArgs -jar "$war" $args

这似乎没有解决它。当 Jenkins 启动时,我可以在控制台中看到该调用,但是当我尝试发送测试配置电子邮件时,我收到以下错误:
Failed to send out e-mail

javax.mail.MessagingException: Could not connect to SMTP host: pod#####.outlook.com, port: 587;
nested exception is:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1934)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638)
at javax.mail.Service.connect(Service.java:317)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:125)
at javax.mail.Transport.send0(Transport.java:194)

关于我还能尝试什么的任何想法?我已经尝试将电子邮件帐户切换为使用 gmail 的 smtp 服务器,并且效果很好,但如果可以的话,我宁愿使用我们的 smtp 服务器。

最佳答案

enter image description here
将 SMTP 端口从 587 更改为 465 为我解决了这个问题:

SMTP server:               smtp.mandrill.com
Use SMTP Authentication:   true
Use SSL:                   true
SMTP Port:                 465
据我所知(免责声明:我绝不是 Hudson/Jenkins 专家)
Hudson/Jenkins 电子邮件插件支持 SSL 加密的 SMTP 通信 - 但是此实现要求从一开始就对通信进行加密。
在端口 587 上连接时,另一端的服务器可能需要一个 STARTTLS 命令(参见这篇 SSL vs TLS vs STARTTLS 文章)。此命令使用纯文本发送以“升级”连接以使用 SSL/TLS。
Hudson/Jenkins 尝试在端口 587 上开始协商 SSL,但立即被拒绝,导致以下错误:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
我尝试添加建议的 JAVA 选项“-Dmail.smtp.starttls.enable=true”来启用 TLS:
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dmail.smtp.starttls.enable=true"
不幸的是,这并没有为我解决问题。
将端口更改为 465 后,SSL 协商正确发生,通信成功。
希望有帮助。
注:当您为任何“SSL - 端口 465”或“非 SSL - 端口 587”配置选中“使用 SMTP 身份验证”选项时,Jenkins 电子邮件插件始终需要 SMTP 凭证,这些凭证通常是发件人的电子邮件凭证。

关于 Jenkins SMTP TLS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11370327/

相关文章:

连接时 Jenkins Slave 连接超时

git - 带有 Jenkins Git 插件和分支说明符的分离式 HEAD

git - Jenkins with Git - 在构建之前将另一个分支* merge 到*当前分支

jenkins - 如何将凭证从一个 Jenkins 实例导出到另一个实例?

jenkins - 如何使用 Jenkins 电子邮件扩展插件显示 HTML

Jenkins 电子邮件分机果冻脚本包含文件内容

jenkins - 什么是publishHtml reportFiles 参数语法

python - 如何使用 Django、Jenkins 和 Sonar 获得测试覆盖率?

jenkins - 如何在jenkins中嵌套多模块maven项目?

java - Solaris 10 64 位上的 Jenkins