我在Netbeans中遇到JavaMail编程问题。当我在IDE中运行下面的代码时,电子邮件会按预期发送。但是,当我执行clean并构建并尝试从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行远程登录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);
}
}
答案 0 :(得分:1)
可能在JVM启动时需要设置属性?尝试使用“java -Djava.net.preferIPv4Stack = true -jar ....”
运行可能你有一些防病毒或防火墙阻止“java”连接,但允许“telnet”连接?尝试暂时关闭任何防病毒或防火墙进行测试。
答案 1 :(得分:0)
Gmail现在随附登录&安全功能默认关闭。为您的帐户启用它,应该可以正常工作。