JavaMail SocketException: Permission denied: connect



我在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,将MailSSLSocketFactory TrustAllHosts设置为true,并在Transport类的实例中使用sendMessage()方法来发送电子邮件。都失败了。

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

我自己是一个调试的大粉丝,但它已经超过一个星期,虽然许多人似乎分享SocketException问题,但没有一个解决方案是有效的。

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

相关代码段(运行于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);
        }
    }

可能需要在JVM启动时设置该属性?尝试运行"java -Djava.net.preferIPv4Stack=true -jar ...."

可能你有一些防病毒或防火墙阻止"java"连接,但允许"telnet"连接?请暂时关闭杀毒软件或防火墙进行测试。

Gmail现在支持Sign-in &安全功能默认关闭。为您的帐户打开它,应该可以正常工作。

https://myaccount.google.com/security

相关内容

  • 没有找到相关文章

最新更新