Использование JavaMail с TLS - PullRequest
46 голосов
/ 04 января 2009

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

Ответы [ 5 ]

60 голосов
/ 04 января 2009

На самом деле в нашем продукте есть некоторый код уведомления, который использует 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).

24 голосов
/ 05 января 2009

Хороший пост, строка

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

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

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

8 голосов
/ 07 ноября 2010

Настройки из приведенного выше примера не работают для сервера, который я использовал ( 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");
6 голосов
/ 03 января 2013

Просто используйте следующий код. Это действительно полезно для отправки электронной почты через 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();
        }

    }

}
2 голосов
/ 19 мая 2016

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

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

Email email = EmailBuilder.startingBlank()
        .from("lollypop", "lol.pop@somemail.com")
        .to("C.Cane", "candycane@candyshop.org")
        .withSubject("hey")
        .withPlainText("We should meet up!")
        .withHTMLText("<b>We should meet up!</b>")
        .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.

...