我在使用 JavaMail 从 hotmail 地址发送电子邮件时遇到问题。我验证我可以通过 telnet 端口 587 连接到 smtp.live.com。有趣的事情(对我来说)是如果我改变:
主机=“smtp.gmail.com”t.connect(主机,用户名,密码);
它可以在默认端口上很好地连接到 Gmail 并发送电子邮件。
但是,如果我将代码更改为:
host = "smtp.live.com" t.connect(host,587, username, password); 它给了我以下错误:
javax.mail.MessagingException:无法连接到 SMTP 主机:smtp.live.com,端口:587;
嵌套异常是:
java.io.IOException: SSL 握手失败:SSL 库失败,通常是协议错误
错误:140770FC:SSL 例程:SSL23_GET_SERVER_HELLO:未知协议(外部/openssl/ssl/s23_clnt.c:604 0xaf076228:0x00000000)
使用 session.setDebug(true) 我得到这个信息:
09-15 01:57:37.280: INFO/System.out(720): DEBUG: getProvider() 返回 javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc., 1.4.1] 09-15 01:57:37.300: INFO/System.out(720): DEBUG SMTP: useEhlo true, useAuth true 09-15 01:57:37.310: INFO/System.out(720): DEBUG SMTP : 试图连接到主机 "smtp.live.com", 端口 587, isSSL true 09-15 01:57:37.330: INFO/SSLSocketFactory(720): Using factory org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl @ 4007ed70 09-15 01:57:37.490:调试/NativeCrypto(720):设置 SSL_OP_NO_SSLv3 09-15 01:57:37.538:错误/NativeCrypto(720):连接期间出现未知错误 1
看起来 Hotmail 与 OpenSSL 不兼容。有人对此有解决方案吗?
下面是我的代码......以防万一它有帮助。
提前致谢,
Ĵ
String host = "smtp.live.com";
String username = foo@hotmail;
String password = "**";
Transport t = null;
Properties props = new Properties();
props.put("mail.smtps.auth", "true");
//props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
Session session = Session.getInstance(props);
session.setDebug(true);
try{
MimeMessage msg = new MimeMessage(session);
msg.setSubject("Testing SMTP-SSL");
msg.setContent("This is a test", "text/plain");
msg.setFrom(new InternetAddress(username));
msg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(username, false));
t = session.getTransport("smtps");
t.connect(host,587, username, password);
t.sendMessage(msg, msg.getAllRecipients());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
t.close();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}