我必须通过 servlet 发送电子邮件,我已经尝试了一堆代码,但没有一个适用于 gmail 帐户,有什么想法吗?
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.auth", "true");
Authenticator auth = new SMTPAuthenticator();
//auth = null;
Session sess = Session.getInstance(props, auth);
sess.setDebug(false);
// -- Create a new message --
Message msg = new MimeMessage(sess);
// -- Set the FROM and TO fields --
msg.setFrom(new InternetAddress("myemail@gmail.com"));
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(
"sendtoemail", false));
msg.setSubject("Test");
msg.setText("Yippe");
msg.setSentDate(new Date());
Transport.send(msg);
public class SMTPAuthenticator extends javax.mail.Authenticator {
@Override
public PasswordAuthentication getPasswordAuthentication() {
String username = "myemail@gmail.com";
String password = "mypass";
return new PasswordAuthentication(username, password);
}
此代码抛出 javax.mail.MessagingException: Could not convert socket to TLS
异常
最佳答案
只是切换到 commons-email 不会消除这个异常(exception)。此外,切换到 commons-email 会导致异常中有用信息的数量减少——异常日志中的以下行将不再存在:
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
在这种情况下,真正的线索是在嵌套异常中。
要修复它,您需要将电子邮件服务器证书安装到 JVM keystore 。默认 keystore 的位置取决于 java 发行版。在我的例子中是 /etc/java-6-sun/security/cacert
添加证书后认证成功。
关于java - 使用 servlet 发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1783334/