使用JavaMail和TLS

我还发现了几个关于JavaMail API和通过SMTP服务器发送邮件的其他问题,但没有一个人讨论过使用TLS安全性。 我正尝试使用JavaMail通过我的工作SMTP邮件服务器向我自己发送状态更新,但它需要TLS,而且我无法find任何有关如何使用JavaMail访问需要TLSencryption的SMTP服务器的示例。 有人能帮忙吗?

实际上,我们的产品中有一些通知代码,如果可用,它们使用TLS发送邮件。

您将需要设置Java邮件属性。 您只需要TLS,但是如果您的SMTP服务器使用SSL,则可能需要SSL。

Properties props = new Properties(); props.put("mail.smtp.starttls.enable","true"); props.put("mail.smtp.auth", "true"); // If you need to authenticate // Use the following if you need SSL props.put("mail.smtp.socketFactory.port", d_port); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); 

然后,您可以将其传递给JavaMail会话或任何其他会话实例化器,如Session.getDefaultInstance(props)

好post,行

 props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 

如果SMTP服务器使用SSL身份validation ,则是强制性的,就像GMail SMTP服务器一样。 但是,如果服务器使用TLS上的纯文本身份validation ,则不应该存在,因为Java邮件会抱怨初始连接是纯文本。

另外请确保您使用的是最新版本的Java Mail。 最近,我使用了以前项目中的一些旧的Java Mail jar,无法使代码正常工作,因为login过程失败。 在升级到最新版本的Java Mail之后,错误的原因变得清晰了:这是一个javax.net.ssl.SSLHandshakeException,它不是在旧版本的lib中抛出的。

上述示例中的设置对于我使用的服务器( authsmtp.com ) 不起作用 。 我一直在得到这个错误:

 javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? 

我删除了mail.smtp.socketFactory设置,一切正常。 最后的设置是这样的(SMTP身份validation没有使用,我设置了其他地方的端口):

 java.util.Properties props = new java.util.Properties(); props.put("mail.smtp.starttls.enable", "true"); 

只需使用下面的代码。 通过Java发送电子邮件是非常有用的,它可以工作:

 import java.util.*; import javax.activation.CommandMap; import javax.activation.MailcapCommandMap; import javax.mail.*; import javax.mail.Provider; import javax.mail.internet.*; public class Main { public static void main(String[] args) { final String username="your@gmail.com"; final String password="password"; Properties prop=new Properties(); prop.put("mail.smtp.auth", "true"); prop.put("mail.smtp.host", "smtp.gmail.com"); prop.put("mail.smtp.port", "587"); prop.put("mail.smtp.starttls.enable", "true"); Session session = Session.getDefaultInstance(prop, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); try { String body="Dear Renish Khunt Welcome"; String htmlBody = "<strong>This is an HTML Message</strong>"; String textBody = "This is a Text Message."; Message message = new MimeMessage(session); message.setFrom(new InternetAddress("your@gmail.com")); message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("receiver@gmail.com")); message.setSubject("Testing Subject"); MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); CommandMap.setDefaultCommandMap(mc); message.setText(htmlBody); message.setContent(textBody, "text/html"); Transport.send(message); System.out.println("Done"); } catch (MessagingException e) { e.printStackTrace(); } } } 

使用简单的Java邮件 (GitHub)应该很简单。 以下是使用Google SMTP服务器的示例:

 Email email = new Email(); email.setFromAddress("lollypop", "lol.pop@somemail.com"); email.addRecipient("C.Cane", "candycane@candyshop.org", RecipientType.TO); email.setText("We should meet up!"); email.setTextHTML("<b>We should meet up!</b>"); email.setSubject("hey"); new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); new Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); new Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email); 

如果您启用了双因子login,则需要从您的Google帐户中生成特定于应用程序的密码 。