我得到java.net.SocketException:权限被拒绝:在Jenkins中发送电子邮件时连接

时间:2013-04-19 17:31:10

标签: java windows-7 jenkins

我的配置:

  • 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 7中存在一个关于防火墙以及Java 7如何使用ipv4映射的ipv6地址的错误。

据报道,这可以通过在java运行时添加-Djava.net.preferIPv4Stack = true来解决。我在使用ANT电子邮件任务在此计算机上添加-Djava.net.preferIPv4Stack = true方面取得了成功。然而,在詹金斯,我没有运气。

请注意,jenkins.xml文件似乎完全被忽略。未设置-Djava.net.preferIPv4Stack = true参数。 PATH和JAVA_HOME都指向IBM运行时,但Jenkins仍然从Oracle v7运行时开始。詹金斯必须催生一个新的流程来启动和获取系统java 7。

使用上面的配置,如果我去Jenkins脚本控制台并使用“System.getProperty(”java.net.preferIPv4Stack“)查询它,我什么也得不到(没有设置)。如果我设置了那个参数,我仍然得到错误。如果我将-Djava.net.preferIPv4Stack = true添加到命令行(不使用该服务),则在通过脚本控制台进行询问时仍未设置它。

我的问题

  1. 为什么我收到此错误以及如何解决?请记住,我可以编写一个ANT脚本,使用相同的smtp服务器和java运行时间成功发送电子邮件。

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

  3. 一些注释:

    • 由于公司存在问题,我无法卸载Java 7.
    • 由于同样的问题,我无法安装Java 6.
    • 我被允许安装IBM JDK / JRE。

2 个答案:

答案 0 :(得分:12)

-jar参数之后的参数将传递给应用程序,而不是java vm。因此,请尝试在-Djava.net.preferIPv4Stack=true参数之前移动-jar

答案 1 :(得分:0)

  

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)在 -jar参数之前将“-Djava.net.preferIPv4Stack = true”部分移动到。它现在看起来应该类似于:

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

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

5)重启jenkins服务

6)从“管理Jenkins - &gt;配置系统”网页发送测试电子邮件。电子邮件现在应该可以使用了。