2013-02-23 2 views
0

나 자신에게 메일을 보낼 수 있지만 (intertubes를 통해 보내지는 않음) 아직 Java를 사용하여 아래처럼 복제 할 수 없습니다. 텔넷을 통해 후위 잘 동작 : 여기 왜 java.net.ConnectException가 발생합니까? Connection refused?

[email protected]:~$ 
[email protected]:~$ telnet localhost 25 
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 
220 dur.bounceme.net ESMTP Postfix (Ubuntu) 
helo me 
250 dur.bounceme.net 
mail from:<[email protected]> 
250 2.1.0 Ok 
rcpt to:<[email protected]> 
250 2.1.5 Ok 
data 
354 End data with <CR><LF>.<CR><LF> 
subject: hmm, is this smtp? 
how do I do this from Java? 
there's no password... 
postfix-dovecot 
. 
250 2.0.0 Ok: queued as 81A9717FEB0 
quit 
221 2.0.0 Bye 
Connection closed by foreign host. 
[email protected]:~$ 

는 자바 스택 추적입니다, 내가 볼 수있는 모든는 java.net.ConnectException: Connection refused 점입니다하지만 난 알고하지 않는 이유 :

Feb 23, 2013 3:03:29 AM net.bounceme.dur.nntp.MessageSender send 
SEVERE: {0} 
javax.mail.MessagingException: Could not connect to SMTP host: dur.bounceme.net, port: 25; 
    nested exception is: 
    java.net.ConnectException: Connection refused 
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1962) 
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:654) 
    at javax.mail.Service.connect(Service.java:295) 
    at net.bounceme.dur.nntp.MessageSender.send(MessageSender.java:57) 
    at net.bounceme.dur.nntp.MessageSender.populate(MessageSender.java:46) 
    at net.bounceme.dur.nntp.MessageSender.<init>(MessageSender.java:30) 
    at net.bounceme.dur.nntp.ArticleReader.<init>(ArticleReader.java:28) 
    at net.bounceme.dur.nntp.Driver.<init>(Driver.java:13) 
    at net.bounceme.dur.nntp.Driver.main(Driver.java:17) 
Caused by: java.net.ConnectException: Connection refused 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391) 
    at java.net.Socket.connect(Socket.java:579) 
    at java.net.Socket.connect(Socket.java:528) 
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:321) 
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:237) 
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1928) 
    ... 8 more 

BUILD SUCCESSFUL (total time: 3 seconds) 

관련 코드 :

package net.bounceme.dur.nntp; 

import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.util.Properties; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.NoSuchProviderException; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

public class MessageSender { 

    private final static Logger LOG = Logger.getLogger(MessageSender.class.getName()); 
    private String header; 
    private String body; 
    private Properties p; 
    private Session session; 
    private MimeMessage message; 

    private MessageSender() { 
    } 

    public MessageSender(Properties p, String... s) throws Exception { 
     header = s[0]; 
     body = s[1]; 
     this.p = p; 
     populate(); 
    } 

    private void populate() throws Exception { 
     String lines[] = header.split("\\n"); 
     session = Session.getDefaultInstance(p, null); 
     message = new MimeMessage(session); 
     LOG.fine("\n\n\n\nnew message************\n\n\n\n"); 

     for (String s : lines) { 
      message.addHeaderLine(s); 
     } 
     message.setContent(message, body); 
     String recipient = p.getProperty("recipient"); 
     message.setRecipients(Message.RecipientType.TO, 
       InternetAddress.parse(recipient)); 
     send(); 
    } 

    private void send() { 
     try { 
      String protocol = p.getProperty("protocol"); 
      String host = p.getProperty("host"); 
      int port = Integer.valueOf(p.getProperty("port")); 
      String username = p.getProperty("username"); 
      String password = p.getProperty("password"); 
      Transport transport = session.getTransport(protocol); 
      transport.connect(host, port, username, password); 
      transport.sendMessage(message, message.getAllRecipients()); 
     } catch (MessagingException ex) { 
      LOG.log(Level.SEVERE, "{0}", ex); 
     } 
    } 
} 

답변

1

저는 Java-Mail에 대한 전문 지식이 없지만 ConnectException: connection refused은 대개 지정된 포트에서 실행중인 서비스가 없을 때 발생합니다.

+0

포트 25는 smtp입니다. Telnet 포트 25를 통해 메시지를 보낼 수 있으므로 서비스 (postfix-dovecot)가 실행중인 것처럼 보입니다. 전자 메일이 Thunderbird에 나타납니다. (FQDN dur.bounceme.net은 나의 사용을위한 것일 뿐이며, "실제"호스트가 아닙니다.) – Thufir

+0

확실하지 않습니다. 완전히 이해합니다. 포트 25에서 텔넷을 통해 메시지를 보낼 수 있습니다. 이는 포트 25에서 실행중인 텔넷 서비스를 의미합니다. 따라서 포트 25에서도 smtp 서비스를 실행할 수 없습니다. 텔넷 서비스는 ' smtp-messages를 수락하지 않습니다. – fachammer

+0

나는 그렇게 생각하지 않는다. http://articles.slicehost.com/2008/8/6/postfix-using-telnet-to-test-postfix에 따라 접미사를 테스트하는 방법과 smtp에 따르면 텔넷을 사용하는 것입니다. 그들은이 목적을 위해'telnet mail.demoslice.com 25'를 예제 명령으로 지정하지만, 그것은 slicehost이기 때문에 다를 수 있습니다. – Thufir