2014-10-01 5 views
0

그루비 스크립트에서 전자 메일을 보내려고합니다. 아래 코드를 입력했습니다 :groovy.lang.GroovyRuntimeException - 이메일 전송시

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: "[email protected]$org", 
          subject: 'Successful build') 

나는 코드를 실행하기 위해 아파치의 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) 

오류 코드의이 부분에서 오는 것 같다 : 오류 메시지는 다음과 같습니다 나는 client.sendMessageData (을 인쇄하려고

writer = new PrintWriter(client.sendMessageData()) 

)와 값이 나오고 null로. 이상적으로는 Writer 객체를 나타내는 값이어야합니다. 문제를 해결하도록 도와주세요. 명령이 어떤 이유로 실패 할 경우

new PrintWriter(client.sendMessageData()) 

나는 sendMessageData 반환 널 생각 :

+1

아무런 인증이 필요하지 않습니까? 'login' 메소드 호출의 결과는 무엇입니까? – Opal

+0

나는 그것이 효과가 있다고 믿는다. 나는'System.out << client.login()'코드로 인쇄하려고 시도하고'true'를 출력합니다. 그래서 나는 그것이 작동해야한다고 생각했습니다. 그것은 null을 얻는'client.sendMessageData()'를 출력 할 때입니다. –

답변

4

문제는 다음과 같다. nullPrintWriter 생성자에 전달하면 Groovy의 동적 디스패치 메커니즘은 호출하려는 생성자를 알 수있는 방법이 없습니다. 당신은 이것을 할 수 있습니다 :

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

모호한 메소드 오버로드 문제는 없지만 여전히 원하는 것은 아닙니다. PrintWriter을 인스턴스화하기 전에 널 (null)에 대한 리턴 값을 확인하려고 할 것입니다.

+0

응답을 형변환하면 모호한 메서드 오버로드 문제가 해결됩니다. 그러나 코드는 여전히 실패합니다. 당신이 말했듯이 sendMessageData()는 실패합니다. 나는 머리를 많이 꺾었으나 실패한 이유를 알아낼 수 없었다. –

+0

SMTP 서버에 연결할 때 문제가 발생했습니다. 다른 도메인의 시스템에서 연결에 대한 방화벽 제한 사항이있었습니다. 일단 그것이 고쳐지면 작동합니다. 감사합니다. @Jeff Scott Brown –

+1

@RohitJose "응답을 형변환하면 애매한 메소드 오버로드 문제가 해결되지만 코드는 여전히 실패합니다." - 권리. 그것이 내가 "그 모호한 메서드 오버로드 문제를 해결할 것입니다,하지만 여전히 당신이 원하는 것이 아닙니다. 아마도 PrintWriter를 인스턴스화하기 전에 null 반환 값을 확인하고 싶을 것입니다. ". 나는 솔루션이 SMTP 호출을 고치는 작업을 포함하고 그것에 추가하여 코드의 논리를 재구성하여 어떤 이유로 실패 할 때 성공했다고 가정하지 않고 처리하도록 생각할 것입니다. –