21

我正在尝试设置 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 的机器)不是很熟悉,但我认为我可以使用提到的解决方法解决这个问题。不过,我不确定该解决方法应该放在哪里,所以我试着把它放在这里:/Library/Application Support/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 服务器。

4

11 回答 11

26

在此处输入图像描述

将 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 凭证,这些凭证通常是发件人的电子邮件凭证。

于 2014-06-19T14:31:09.260 回答
21

我对 Jenkins 有同样的问题,但我的安装在 Centos 而不是 Apple OS 上。我仍然想在这里发布解决方案,因为 A)您可能能够对解决方案进行必要的调整,并且 B)Linux 和 Jenkins 用户可能会从中受益。

无论如何,找到 Jenkins 配置文件(在 CENTOS 中的 /etc/sysconfig/jenkins 中)

在其中找到 JENKINS_JAVA_OPTIONS 变量并添加以下选项“-Dmail.smtp.starttls.enable=true”在我的情况下,这是我以前的情况:

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"

这是之后;

JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dmail.smtp.starttls.enable=true"

重启 Jenkins 服务器(在 Linux 中)

/etc/init.d/jenkins restart
于 2013-05-23T14:40:15.870 回答
12

对于 Windows 上的 Jenkins

打开 jenkins.xml 并修改参数节点

-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -Dmail.smtp.starttls.enable=true -jar "%BASE%\jenkins.war" --httpPort=8080

对于 smtp.live.com:

将 SMTP 端口设置为 587 并取消选中Use SSL

于 2014-02-03T12:15:15.120 回答
3

即使在-Dmail.smtp.starttls.enable=true文件(debian/ubuntu)中@nsof 的答案中提到的设置之后/etc/default/jenkins,它对我也不起作用。

诀窍是将 SMTP 端口设置为587取消选中 Use SSL如下所示,然后电子邮件发送成功。

在此处输入图像描述

于 2016-01-01T04:54:55.247 回答
1

尝试错误本身中提到的解决方法:

http://issues.hudson-ci.org/browse/HUDSON-2206

在 Java 中:

props.put("mail.smtp.starttls.enable","true");

在 Tomcat 中:

添加JAVA_OPTS=-Dmail.smtp.starttls.enable="true"到 tomcat 配置文件。

于 2013-03-14T08:47:36.527 回答
0

添加 -Dmail.smtp.starttls.enable=true 作为 JAVA_OPTS 的参数解决了我的问题

如果您的 jenkins 在独立模式下运行,请更新 /etc/sysconfig/jenkins 中的 JAVA_OPTS 如果您的 jenkins 在 tomcat 中运行,请更新 JAVA_OPTS

  • 用于 unix 的 catalina.sh
  • 用于 windows 的 catalina.bat
于 2014-09-02T14:03:12.933 回答
0

使用 Jenkins 2.134,以下内容对我有用:

  • JAVA_TOOL_OPTIONS=-Dmail.smtp.starttls.enable=true
  • 取消勾选 Use SSL
于 2018-09-11T09:23:39.647 回答
0

如果上述解决方案都不起作用,这是最好的解决方案。

https://issues.jenkins-ci.org/browse/JENKINS-47939

于 2019-07-16T10:06:58.287 回答
0

对于Ubuntu 16.04上的 Jenkins :

1 - 编辑配置文件:

sudo nano /etc/default/jenkins

2 - 注释掉现有的 JAVA_ARGS,添加新的如下所示:

#JAVA_ARGS="-Djava.awt.headless=true"
JAVA_ARGS="-Djava.awt.headless=true -Dmail.smtp.starttls.enable=true"

3 - 重启詹金斯

sudo service jenkins restart

在此处输入图像描述

于 2017-05-04T14:11:28.617 回答
0

在@user11791348 的回答中发表声明后,为我解决了这个问题。

声明是:“重要的是要注意“电子邮件通知”部分的用户名和“Jenkins 位置”部分的系统管理员电子邮件地址必须是有效的 smtp.office365.com 用户。如果其中一个不是在 smtp.office365.com 中找到,您将收到“客户端无权作为此发件人发送”错误”

因此,我在 Jenkins 中配置了系统管理员电子邮件地址,我的 Jenkins.xml 也包含以下行:

<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -Djava.awt.headless=true -Dmail.smtp.starttls.enable=true -jar "C:\Program Files\Jenkins\jenkins.war" --httpPort=8080 --webroot="%LocalAppData%\Jenkins\war"</arguments>

使用 SSL:未选中使用 TLS:未选中 SMTP 端口:587

于 2021-01-13T11:42:36.357 回答
0

对于 Red Hat Enterprise Linux Server 版本 7.4 (Maipo) 上的 Jenkins,编辑 /etc/sysconfig/jenkins 以添加

在此处输入图像描述

Jenkins 服务配置文件需要机器的 root 访问权限。在 CloudBees Jenkins Enterprise 中,您可以在以下位置找到此文件:

  • /etc/default/jenkins:大多数 Linux 发行版的位置。
  • /etc/sysconfig/jenkins:RedHat/CentOS 发行版的位置。
  • C:\Program Files\Jenkins\jenkins.xml:Windows 的默认位置
于 2017-11-07T21:27:14.653 回答