Netbeans JavaMail SocketException:权限被拒绝:连接

Netbeans JavaMail SocketException:权限被拒绝:连接,netbeans,gmail,jakarta-mail,socketexception,Netbeans,Gmail,Jakarta Mail,Socketexception,我对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: Pro

我对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进行构建,但没有成功。许多站点(例如,)建议在netbeans配置文件夹中使用以下内容的一些变体来修复IPv6问题:-Djava.net.preferIPv4Stack=true。我也将其放在VM选项中,正如您在下面看到的,我还尝试在代码中实现它。其他仍在使用的尝试修复程序包括将socketFactor.class属性设置为javax.net.ssl.SSLSocketFactory,将MailssSocketFactory TrustAllHosts设置为true,以及在Transport类的实例中使用sendMessage()方法发送电子邮件。都失败了

我曾尝试通过587端口和cmd线路远程登录gmail,连接已成功建立

我自己也非常喜欢调试东西,但是已经一个多星期了,虽然很多人似乎都在分享SocketException问题,但没有一个解决方案是有效的

我对这个问题的解决方案持开放态度,或者坦率地说,任何用Java发送电子邮件的替代方法。阅读电子邮件对于此代码并不重要。最有用的是代码片段,而不仅仅是描述,所以我可以将它们放入代码中运行。提前谢谢

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


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


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

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


提前设置属性有效!我不知道这个语法,谢谢。那么我每次都必须从命令行运行它吗?我希望将其打包到一个.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还在运行,它就会打开文件并运行最小化但仍然有用的命令行。
    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);
        }
    }