【发布时间】: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