【问题标题】:groovy.lang.GroovyRuntimeException on sending an Emailgroovy.lang.GroovyRuntimeException 发送电子邮件
【发布时间】:2014-10-01 22:12:01
【问题描述】:

我正在尝试从 groovy 脚本发送电子邮件。我给出了以下代码:

import org.apache.commons.net.smtp.*

port = 25
org = 'mycompany.org'


client = new SMTPClient()
client.connect('<server_name>', port)
client.login()

// set sender and recipient
client.sender = "<email_address>"
client.addRecipient("<email_address>")

// create and send header information
header = new SimpleSMTPHeader("<email_address>",
        "<email_address>", 'Successful build')
header.addCC("<email_address>")
header.addHeaderField('Organization', org)
writer = new PrintWriter(client.sendMessageData())
writer << header

// send body of message
writer << 'Successful build for ' + new Date()
writer.close()

client.logout()
client.disconnect()

fixture.assertEmailArrived(from: "cruise@$org",
                           subject: 'Successful build')

我正在使用 apache 的 commons-net-2.0.jar 来运行代码。错误信息如下:

Caught: groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method java.io.PrintWriter#<init>.
Cannot resolve which method to invoke for [null] due to overlapping prototypes between:
    [class java.lang.String]
    [class java.io.File]
    [class java.io.Writer]
    [class java.io.OutputStream]
groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method java.io.PrintWriter#<init>.
Cannot resolve which method to invoke for [null] due to overlapping prototypes between:
    [class java.lang.String]
    [class java.io.File]
    [class java.io.Writer]
    [class java.io.OutputStream]
    at TestEmail.run(TestEmail.groovy:20)

错误似乎来自这部分代码:

writer = new PrintWriter(client.sendMessageData())

我试图打印出 client.sendMessageData() 并且该值显示为 null。理想情况下,它应该是一些表示 Writer 对象的值。请帮我解决问题。

【问题讨论】:

  • 您不需要任何身份验证吗? login方法调用的结果是什么?
  • 我相信它正在工作。我尝试使用代码System.out&lt;&lt;client.login() 将其打印出来,并打印出true。所以我认为它必须工作。当我打印出client.sendMessageData() 时,我得到一个空值。

标签: email groovy apache-commons-net


【解决方案1】:

问题如下:

new PrintWriter(client.sendMessageData())

我认为如果命令由于某种原因失败,sendMessageData 会返回 null。当您将null 传递给PrintWriter 构造函数时,Groovy 的动态调度机制无法知道您尝试调用哪个构造函数。你可以这样做:

new PrintWriter((Writer)client.sendMessageData())

这将消除模棱两可的方法重载问题,但仍然可能不是您想要的。您可能希望在实例化 PrintWriter 之前检查返回值是否为 null。

【讨论】:

  • 对响应进行类型转换确实解决了模棱两可的方法重载问题。但是代码仍然失败。正如你所说, sendMessageData() 失败了。我绞尽脑汁,但无法弄清楚为什么会失败。
  • 问题出在连接到 SMTP 服务器时,来自不同域的系统的连接存在防火墙限制。一旦解决了它就可以工作。谢谢@Jeff Scott Brown
  • @RohitJose “对响应进行类型转换确实解决了模棱两可的方法重载问题。但代码仍然失败。” - 正确的。这就是我所说的“这将消除模棱两可的方法重载问题,但仍然可能不是您想要的。您可能希望在实例化 PrintWriter 开始之前检查 null 的返回值。 ”。我认为解决方案将涉及修复 SMTP 调用,使其正常工作,除此之外,重新组织代码中的逻辑,以便当它由于某种原因失败时,你处理它而不是假设它成功
猜你喜欢
  • 2011-09-16
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
相关资源
最近更新 更多