2014-10-01 3 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') 

Я использую сервера Apache Commons-нетто-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. Пожалуйста, помогите мне решить проблему.

+1

Не нужна аутентификация? Каков результат вызова метода login? – Opal

+0

Я считаю, что он работает. Я попытался распечатать его с помощью кода 'System.out << client.login()' и он выдает «true». Поэтому я решил, что он должен работать. Когда я печатаю 'client.sendMessageData()', я получаю нуль. –

ответ

4

Проблема заключается в следующем:

new PrintWriter(client.sendMessageData()) 

Я думаю, что sendMessageData возвращает нулевое значение, если команда не по какой-то причине. Когда вы передаете null в конструктор PrintWriter, динамический диспетчер Groovy не имеет никакого способа узнать, какой конструктор вы пытаетесь вызвать. Вы можете сделать это:

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

Это покончит с неоднозначным метод перегрузки вопрос, но все же, вероятно, не то, что вы хотите. Вероятно, вы захотите проверить возвращаемое значение для null до того, как начать с PrintWriter.

+0

Устранение неполадок, связанных с проблемой перегрузки. Но код все еще не работает. Как вы сказали, sendMessageData() не работает. Я много ломал голову, но не смог понять, почему она терпит неудачу. –

+0

Проблема заключалась в подключении к SMTP-серверу, были ограничения брандмауэра для подключения из систем другого домена. Как только это исправлено, оно работает. Спасибо @Jeff Scott Brown –

+1

@RohitJose «Typecasting ответ разрешает проблему неоднозначной перегрузки метода, но код все равно не работает». - Правильно. Это то, что я получал, когда я сказал: «Это покончит с проблемой неоднозначной перегрузки метода, но все же, вероятно, это не то, что вы хотите. Вероятно, вы хотите проверить возвращаемое значение для null, прежде чем создавать экземпляр PrintWriter. ». Я бы подумал, что решение будет включать в себя исправление SMTP-вызова, чтобы оно работало и в дополнение к этому, реорганизация логики в вашем коде, так что когда она по какой-то причине не справляется, вы обрабатываете ее, а не предполагаете ее успешной –

 Смежные вопросы

  • Нет связанных вопросов^_^