当在Jenkins发送邮件时,我收到java.net.SocketException: Permission denied: connect错误。

8

我的配置:

  • Windows 7机器
  • Java 7
  • Jenkins 1.511以本地帐户服务运行

我的jenkins.xml文件

<service>
  <id>jenkins</id>
  <name>Jenkins</name>
  <env name="JENKINS_HOME" value="%BASE%"/>
  <executable>C:\Program Files\IBM\SDP8.5\jdk\bin\java.exe</executable>
  <arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 -Djava.net.preferIPv4Stack=true</arguments>
</service>

我的 hudson.tasks.Mailer.xml 文件

<hudson.tasks.Mailer_-DescriptorImpl plugin="mailer@1.4">
  <defaultSuffix>@example.com</defaultSuffix>
  <hudsonUrl>http://localhost:8081/</hudsonUrl>
  <adminAddress>Jenkins Build Server &lt;do-not-reply@example.com&gt;</adminAddress>
  <smtpHost>smtp.example.com</smtpHost>
  <useSsl>false</useSsl>
  <charset>UTF-8</charset>
</hudson.tasks.Mailer_-DescriptorImpl>

注意:"example.com"是我真正的域名/电子邮件/SMTP服务器的替代品。
当我要求Jenkins发送测试电子邮件时,出现以下错误:
Failed to send out e-mail

javax.mail.MessagingException: Could not connect to SMTP host: smtp.example.com, port: 25;
nested exception is:
java.net.SocketException: Permission denied: connect

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:295)

我的理解是,在Windows中存在一个错误,Java 7暴露了这个错误,涉及到防火墙以及Java 7如何使用ipv4映射的ipv6地址。可以通过在Java运行时添加-Djava.net.preferIPv4Stack=true来解决这个问题。我在这台机器上使用ANT电子邮件任务添加-Djava.net.preferIPv4Stack=true成功了。但是,在Jenkins上,我没有成功过。需要注意的是,jenkins.xml文件似乎被完全忽略了。-Djava.net.preferIPv4Stack=true参数没有被设置。路径和JAVA_HOME都指向IBM运行时,但Jenkins仍然使用Oracle v7运行时启动。Jenkins必须生成一个新进程来启动,并选择系统Java 7。使用以上配置,如果我进入Jenkins脚本控制台并使用"System.getProperty("java.net.preferIPv4Stack")"进行询问,我得不到任何消息(未设置)。如果我设置该参数,仍然会出现错误。如果我在命令行中添加-Djava.net.preferIPv4Stack=true(不使用服务),当通过脚本控制台进行调查时,它仍未被设置。 我的问题是:
1.我为什么会收到这个错误,并如何解决它?请记住,我可以编写一个ANT脚本,使用相同的SMTP服务器和Java运行时成功发送电子邮件。
2.如何让Jenkins以指定的运行时和-Djava.net.preferIPv4Stack=true参数启动?
一些注意事项:
1.由于某些无聊的企业问题,我无法卸载Java 7。
2.由于同样的问题,我无法安装Java 6。
3.我可以安装IBM JDK/JRE。

你尝试过将“-Djava.net.preferIPv4Stack=true”移动到“-jar”参数之前吗? - NilsH
这个方法可行!谢谢。你能把它作为答案吗,这样我就可以将其选为最佳答案了吗? - Brian Chapman
2个回答

12
< p > -jar参数后的参数将传递给应用程序,而不是Java虚拟机。因此,请尝试在-jar参数之前移动-Djava.net.preferIPv4Stack=true


请问您如何添加上述参数“-Djava.net.preferIPv4Stack=true”?我正在使用JDK 7,但不知道在哪里添加。 - saikiran

1

2. 如何让Jenkins在启动时带有"-Djava.net.preferIPv4Stack=true"参数并指定运行时间?

我不确定Java运行时,但对于这个参数,以下是我使用的方法:" -Djava.net.preferIPv4Stack=true"。

1)打开记事本"C:\Program Files (x86)\Jenkins\jenkins.xml"

2)查找类似于以下行:

<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 -Djava.net.preferIPv4Stack=true</arguments>

3) 将"-Djava.net.preferIPv4Stack=true"部分移动到-jar参数之前。现在它应该看起来类似于:

<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -Djava.net.preferIPv4Stack=true -jar "%BASE%\jenkins.war" --httpPort=8080</arguments>

4) 保存文件并退出记事本。

5) 重新启动Jenkins服务。

6) 从“管理Jenkins->配置系统”网页发送测试电子邮件。现在应该可以正常发送邮件了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接