【问题标题】:JavaMail SocketException: Permission denied: connectJavaMail SocketException:权限被拒绝:连接
【发布时间】:2014-07-29 13:57:51
【问题描述】:

我在 Netbeans 中使用 JavaMail 编程时遇到问题。当我在 IDE 中运行以下代码时,电子邮件会按预期发送。但是,当我执行清理和构建并尝试从 JAR 可执行文件执行相同的操作时,我会从调试器收到以下信息:

DEBUG: JavaMail version 1.5.2
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 true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.gmail.com, 587; timeout -1;
  nested exception is:
    java.net.SocketException: Permission denied: connect

我曾尝试同时使用 JDK1.8 和 JDK1.7 进行构建,但均未成功。许多站点(对于example,)建议在netbeans 配置文件夹中使用以下一些变体来修复IPv6 问题:-Djava.net.preferIPv4Stack=true。我也将它放在了 VM 选项中,如下所示,我也尝试在我的代码中实现它。其他尝试的修复仍然存在,将 socketFactor.class 属性设置为 javax.net.ssl.SSLSocketFactory,将 MailSSLSocketFactory TrustAllHosts 设置为 true,以及在 Transport 类的实例中使用 sendMessage() 方法来发送电子邮件。都失败了。

我已经尝试通过 587 端口和 cmd 线 telnet gmail,并且已经成功建立连接。

我自己是调试东西的忠实粉丝,但已经过去一个多星期了,虽然很多人似乎都分享了 SocketException 问题,但没有一个解决方案有效。

我愿意接受这个问题的解决方案,或者坦率地说,任何使用 Java 发送电子邮件的替代方法。阅读电子邮件对于此代码并不重要。最有用的是代码 sn-ps 而不仅仅是描述,因此我可以将它们放入我的代码中运行。提前致谢!

相关代码段(在Windows 7中运行):

    static void sendEmail(String toAddress, String subject, String body) throws NoSuchProviderException, MessagingException, GeneralSecurityException {
        try {
            System.setProperty("java.net.preferIPv4Stack", "true");
            String host = "smtp.gmail.com";
            String username = "sampleuser@gmail.com";
            String password = "password";
            Properties props = new Properties();
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.host", host);
            props.put("mail.smtp.port", "587");
            props.put("mail.debug", "true");
            props.put("mail.smtp.debug", "true");
            props.put("mail.smtp.password", password);
            props.put("mail.smtp.user", "sampleuser");
            props.put("mail.smtp.socketFactory.class",
                    "javax.net.ssl.SSLSocketFactory");
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);

            Session session = Session.getInstance(props);
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username));
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(toAddress));
            message.setSubject(subject);
            message.setText(body);
            Transport t = session.getTransport("smtp");
            try {
                t.connect(host, username, password);
                t.sendMessage(message, message.getAllRecipients());
            }catch(Exception e){
                System.out.println(e);
            } finally {
                t.close();
            }
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }

【问题讨论】:

    标签: netbeans gmail jakarta-mail socketexception


    【解决方案1】:

    可能JVM启动时需要设置属性?尝试使用“java -Djava.net.preferIPv4Stack=true -jar ....”运行

    可能你有一些防病毒或防火墙阻止“java”连接,但允许“telnet”连接?尝试暂时关闭任何防病毒或防火墙进行测试。

    【讨论】:

    • 提前设置属性有效!我不知道这种语法,谢谢。那么我每次都必须从命令行运行它吗?我希望把它打包成一个 .jar 分发给我的同事......
    • 更新:只是为了好玩,我从命令行将它重新运行为 java -Djava.net.preferIPv4Stack=false -jar ...." 并且它无论如何都可以工作(将属性设置为 false)。它似乎只有当我通过双击打开可执行文件时才会出现问题。
    • 有趣。它可能仍然与您的防病毒或防火墙有关,它知道允许“java”命令但不知道允许您的 jar 文件。
    • 这是有道理的。不幸的是,我认为我对防病毒或防火墙没有任何发言权。大公司,大IT部门。我已经尝试将它打包在一个 .cmd 文件中,它可以解决这个问题。唯一的问题是我不希望我的用户看到命令窗口。有什么方法可以从 .cmd 文件启动它并隐藏命令窗口?
    • 我的最终解决方案是使用 Bill 的建议,使用以下代码创建一个 .txt 文件:set path=C:\Program Files (x86)\Java\jre7\bin [NEW LINE] start /min java -Djava.net.preferIPv4Stack=true -jar "Path\to\jar\file.jar" 并将文件另存为 .cmd 文件。这将打开文件并运行一个最小化但仍然有用的命令行,只要 .jar 正在运行。
    【解决方案2】:

    Gmail 现在默认关闭了登录和安全功能。为您的帐户打开它,应该可以正常工作。

    https://myaccount.google.com/security

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      • 2014-05-15
      相关资源
      最近更新 更多