我在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