【问题标题】:why do I get java.net.ConnectException: Connection refused?为什么我会得到 java.net.ConnectException:连接被拒绝?
【发布时间】:2013-02-08 23:52:31
【问题描述】:

我可以给自己发送邮件(不是通过 intertubes 发送),但似乎无法使用 Java 进行如下复制。 Postfix 通过 telnet 表现良好:

thufir@dur:~$ 
thufir@dur:~$ 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:<someone@somewhere.com>
250 2.1.0 Ok
rcpt to:<thufir@dur.bounceme.net>
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.
thufir@dur:~$ 

这是 Java 中的堆栈跟踪,我只能看到它是 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);
        }
    }
}

【问题讨论】:

    标签: java smtp mime postfix-mta jakarta-mail


    【解决方案1】:

    我不是 Java-Mail 专家,但 ConnectException: connection refused 通常在指定端口上没有运行服务时出现。

    【讨论】:

    • 端口 25 是 smtp,我相信。我可以通过 telnet 端口 25 发送消息,因此服务(postfix-dovecot)似乎正在运行。电子邮件显示在 Thunderbird 中。 (FQDN dur.bounceme.net 仅供我使用,它不是“真正的”主机。)
    • 我不确定,我完全理解你。您可以通过端口 25 上的 telnet 发送消息,这意味着端口 25 上正在运行一个 telnet 服务。因此,在端口 25 上也无法运行 smtp 服务,这意味着您会收到拒绝,因为 telnet 服务可以' t 接受 smtp 消息。
    • 我不这么认为。根据articles.slicehost.com/2008/8/6/… 的方式来测试postfix,并用它进行smtp,就是使用telnet 来做。他们为此指定了 telnet mail.demoslice.com 25 作为示例命令,但也许这不同,因为它是 slicehost。
    • 哦,是的,你是对的。我不知道您可以通过 telnet 发送电子邮件。你能把你设置的属性发布到 MessageSender 吗?
    • 问题是我将localhost 与telnet 一起使用,但Java 现在收到关于SMTP host: dur.bounceme.net, port: 25; 的错误,主机是dur.bounceme.net,但通过更改我不再收到连接错误MessageSender 的host 属性读取localhost。我的回忆是我应该能够使用 FQDN dur.bounceme.net 但这是一个相对较小的问题,我不再遇到连接错误。 (我收到一个关于某些标题无效的全新错误,大声笑。)我认为谜团已解决。
    猜你喜欢
    • 2015-05-18
    • 2018-06-10
    • 2023-03-21
    • 2017-08-10
    • 1970-01-01
    • 2014-11-01
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多