Использование JavaMail с TLS

Я нашел несколько других вопросов относительно SO относительно API JavaMail и отправки почты через SMTP-сервер, но ни один из них не обсуждал использование безопасности TLS. Я пытаюсь использовать JavaMail для отправки обновлений статуса себе через мой почтовый сервер SMTP, но для этого требуется TLS, и я не могу найти примеры онлайн о том, как использовать JavaMail для доступа к SMTP-серверу, который требует шифрования TLS. Может кто-нибудь помочь с этим?

На самом деле у нас есть код уведомления в нашем продукте, который использует TLS для отправки почты, если он доступен.

Вам нужно будет установить свойства Java Mail. Вам нужен только TLS, но вам может понадобиться SSL, если ваш SMTP-сервер использует 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) .

Хороший пост, линия

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

является обязательным, если SMTP-сервер использует SSL-аутентификацию , как это делает SMTP-сервер GMail. Однако, если сервер использует проверку подлинности Plaintext через TLS , он не должен присутствовать, потому что Java Mail будет жаловаться на то, что начальное соединение является открытым текстом.

Также убедитесь, что вы используете последнюю версию Java Mail. Недавно я использовал некоторые старые банки Java Mail из предыдущего проекта и не смог заставить код работать, потому что процесс входа в систему был неудачным. После того, как я обновился до последней версии Java Mail, причина ошибки стала ясна: это было javax.net.ssl.SSLHandshakeException, которое не было выбрано в старой версии lib.

Настройки из приведенного выше примера не работали для сервера, который я использовал ( authsmtp.com ). Я продолжал получать эту ошибку:

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

Я удалил настройки mail.smtp.socketFactory и все сработало. Окончательные настройки были такими (SMTP-аутентификация не использовалась, и я установил порт в другом месте):

 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="[email protected]"; 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 = "This is an HTML Message"; String textBody = "This is a Text Message."; Message message = new MimeMessage(session); message.setFrom(new InternetAddress("[email protected]")); message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("[email protected]")); 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(); } } } 

С Simple Java Mail 5.0.0 (simplejavamail.org) это очень просто, и библиотека позаботится о всех свойствах сеанса для вас.

Вот пример использования SMTP-серверов Google:

 Email email = EmailBuilder.startingBlank() .from("lollypop", "[email protected]") .to("C.Cane", "[email protected]") .withSubject("hey") .withPlainText("We should meet up!") .withHTMLText("We should meet up!") .buildEmail(); MailerBuilder.withSMTPServer("smtp.gmail.com", 25, "user", "pass", SMTP_TLS) .buildMailer() .sendMail(email); MailerBuilder.withSMTPServer("smtp.gmail.com", 587, "user", "pass", SMTP_TLS) .buildMailer() .sendMail(email); MailerBuilder.withSMTPServer("smtp.gmail.com", 465, "user", "pass", SMTP_SSL) .buildMailer() .sendMail(email); 

Если вы включили двухфакторный вход, вам необходимо создать специальный пароль для вашего аккаунта Google.

  • Использовать самоподписанный сертификат cURL?
  • Java: загрузка SSL Keystore через ресурс
  • Почему SSL-квитирование дает исключение «Не удалось создать DH keypair»?
  • Присвоение имени домена локальному хосту для среды разработки
  • javax.net.ssl.SSLPeerUnverifiedException: имя хоста не соответствует теме сертификата, предоставленной партнером
  • Java7 Отказ от доверия сертификату в хранилище доверия
  • Force SSL / HTTPS с mod_rewrite
  • Проверка подлинности клиента HTTPS на Java
  • Недопустимый самоподписанный SSL-сертификат - «Тема альтернативного имени отсутствует»
  • Использовать SSL с помощью ssl_requirement в приложении Rails 2
  • Установка SSL на сервере Wamp: ошибка в httpd-ssl.conf
  • Давайте будем гением компьютера.