Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Вам нужно будет установить свойства Mail 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).

Ответ 2

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

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.

Ответ 3

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

Ответ 4

Просто используйте следующий код. Очень полезно отправлять электронную почту через 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 = "<strong>This is an HTML Message</strong>";
                 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();
        }

    }

}

Ответ 5

С 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("<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.