Jenkins SMTP TLS

时间:2012-07-06 22:12:17

标签: 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的机器)不是很熟悉,但我想我可以使用上面提到的解决方法解决问题。我不确定在哪里放置该解决方法,所以我试着把它放在这里: / 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服务器。

11 个答案:

答案 0 :(得分:20)

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通信 - 但是这种实现要求通信从get get加密。

在端口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协商正常,通信成功。

希望有所帮助。

注意: Jenkins电子邮件插件始终需要SMTP凭据,当您勾选“使用SMTP身份验证”选项时,通常是发件人的电子邮件凭据,用于任何“SSL - 端口465”或“非SSL - 端口587”配置。

答案 1 :(得分:18)

我和Jenkins有同样的问题,但我的是安装在Centos而不是Apple OS上。我仍然想在这里发布解决方案,因为A)您可能能够对解决方案进行必要的调整.B)Linux&amp; 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

答案 2 :(得分:9)

对于Windows上的Jenkins

打开jenkins.xml并修改参数node

  

-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

答案 3 :(得分:2)

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

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

enter image description here

答案 4 :(得分: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配置文件。

答案 5 :(得分:0)

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

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

  • catalina.sh for unix
  • catalina.bat for windows

答案 6 :(得分: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 - 重启Jenkins

sudo service jenkins restart

enter image description here

答案 7 :(得分:0)

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

enter image description here

Jenkins服务配置文件需要对计算机进行root访问。 在CloudBees Jenkins Enterprise中,您可以在以下位置找到此文件:

  • / etc / default / jenkins:大多数Linux发行版的位置。
  • / etc / sysconfig / jenkins:RedHat / CentOS发布的位置。
  • C:\ Program Files \ Jenkins \ jenkins.xml:Windows的默认位置

答案 8 :(得分:0)

以下是詹金斯2.134的工作原理:

  • JAVA_TOOL_OPTIONS=-Dmail.smtp.starttls.enable=true
  • 取消选中 Use SSL

答案 9 :(得分:0)

如果上述解决方案均无效,这是最好的解决方案。

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

答案 10 :(得分: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