【问题标题】:SocketException when connecting to SMTP server, but with telnet it's working连接到 SMTP 服务器时出现 SocketException,但使用 telnet 可以正常工作
【发布时间】:2023-03-18 05:07:02
【问题描述】:

我想通过 Java 发送电子邮件,但不幸的是我收到了以下异常:

javax.mail.MessagingException: 
    Could not connect to SMTP host: localhost, port: 25;
        nested exception is:
            java.net.SocketException: Permission denied: connect

我正在使用this little example program 发送我的电子邮件。

但是当尝试连接到服务器时

telnet localhost 25

我能够建立连接。

远程 SMTP 服务器也会出现同样的情况。

可能是什么问题?


这里将mail.debug 设置为"true" 的输出:

DEBUG: JavaMail version 1.4.7
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "localhost", port 25, isSSL false

【问题讨论】:

  • 它显然是Permission Denied,您需要传递身份验证信息才能连接到SMTP 服务器,否则您的java smpt 客户端配置有问题..
  • @harsh 我没有通过 telnet 传递任何身份验证信息并且它正在工作。
  • 尝试设置props.put("mail.debug", "true") 假设props 是您的Properties 实例,它会在控制台上打印smtp 内部日志,这可能有助于进一步调试
  • @harsh 不幸的是,这并没有改变任何东西。检索此属性时,它的计算结果为 null
  • @hash 我错了:我将它设置为false 而不是true。但是输出不是很有帮助:DEBUG SMTP: trying to connect to host "localhost", port 25, isSSL false

标签: java email smtp telnet socketexception


【解决方案1】:

我有类似的问题。花了几个小时后,终于通过在代码中添加以下行来解决问题:

System.setProperty("java.net.preferIPv4Stack" , "true");

默认情况下,Java 使用 ipv6,而我传递的是 ipv4 地址。放上面线后,它起作用了。

【讨论】:

    【解决方案2】:

    您可以尝试使用以下程序检查 gmail smtp 服务器(假设您有 gmail 帐户),如果这工作正常,那么您肯定是 Mercury 邮件服务器设置有问题:

    public static void main(String[] args) throws Exception {
        String host = "smtp.gmail.com";
        String username = "your-gmail-username@gmail.com";
        String password = "gmail-password";
        Properties props = new Properties();
        props.put("mail.debug", true);
        Session session = Session.getInstance(props);
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(username));
        msg.setRecipient(RecipientType.TO, new InternetAddress(username));
        msg.setSubject("This is the Subject Line!");
        msg.setContent("<h1>This is actual message</h1>",
                           "text/html" );
        Transport t = session.getTransport("smtps");
        try {
            t.connect(host, username, password);
            t.sendMessage(msg, msg.getAllRecipients());
        } finally {
            t.close();
        }
    }
    

    【讨论】:

      【解决方案3】:

      我不同意苛刻(对不起,我不能评论我应该评论的地方,没有足够的声誉)。 Permission denied 错误发生在 connect 系统调用中,因此客户端甚至可以尝试对服务器进行身份验证。

      不幸的是,您没有提供有关您正在运行的系统的任何信息 - windows、linux、其他一些 unix 或完全不同的系统。

      我曾经在一家公司遇到过这种问题,所有客户端 PC 上的本地 McAffee 都配置为阻止所有流量到端口 25,因此如果客户端感染了病毒,它仍然无法邮件炸弹其他人。也许你的系统上正在运行类似的东西?

      或者,可能是 ipv4(我假设您是从 java 中使用的)被阻止但允许使用 ipv6 的问题。尝试在 telnet 连接后执行 netstat 以找出它正在使用哪个。但同样,我认为这与您计算机上的防火墙设置有关,这可能允许其中一种 IP 协议但不允许另一种。

      【讨论】:

      • 防火墙问题在我看来不太可能 (host: localhost, port: 25),除非 harold 对本地机器进行了一些更改...并且telnet 也能够连接。现在在auth 上再次被排除,因为telnet 客户端也没有使用任何auth 信息,我错过了这一点,并且基于exception @Harold 您已经在您的机器上设置的smtp 服务器和有什么具体的配置吗??
      • @harsh 我在公司内部运行 Windows 7。我的本地 Mercury Mail SMTP 服务器以及远程测试服务器都会出现此问题。
      • @harsh 问题是 IPv6 已被阻止。另见stackoverflow.com/questions/14064111/…
      • 太好了,我猜telnet 没有使用IPv6,因此可以工作;一个好记的指针。
      【解决方案4】:

      为了通过您的应用程序通过 SMTP 发送邮件,您需要将机器的 IP 中继到 SMTP 服务器上。

      获取在 SMTP 服务器上中继的 Ip。从此以后,您将能够发送邮件并且不会因为权限被拒绝而获得异常

      【讨论】:

      • 您能否详细说明您的答案?我该如何配置?
      • 您能告诉我您使用的 SMTP 服务器吗?
      • 我正在使用 Mercury Mail。
      猜你喜欢
      • 2011-09-12
      • 2015-03-22
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      相关资源
      最近更新 更多