JavaMail mail.smtp.ssl.enable не работает

Я читал на нескольких сайтах, которые при использовании API JavaMail устанавливают для свойства mail.smtp.ssl.enable значение true. У меня есть код следующим образом:

props.put("mail.smtp.host", "exchangemail1.example.com");
props.put("mail.from", "[email protected]");
props.put("mail.smtp.starttls.enable", "true");
// I tried this by itself and also together with ssl.enable)
props.put("mail.smtp.ssl.enable", "true");

Session session = Session.getInstance(props, null);
MimeMessage msg = new MimeMessage(session);
msg.setFrom();
msg.setRecipients(Message.RecipientType.TO, "[email protected]");  
    // also tried @gmail.com
msg.setSubject("JavaMail ssl test");
msg.setSentDate(new Date());
msg.setText("Hello, world!\n");
props.put("mail.smtp.auth", "false");

Transport trnsport;
trnsport = session.getTransport("smtp");
trnsport.connect();
msg.saveChanges(); 
trnsport.sendMessage(msg, msg.getAllRecipients());
trnsport.close();

Это отправляет письмо, но:

  • Когда я делаю захват трафика, я вижу, что он не зашифрован.
  • При использовании debug (props.put("mail.debug", "true")) я вижу, что "isSSL false"

(Я также попытался добавить в props.put("mail.smtp.auth","true") + user/password....)

Любые идеи, что я делаю неправильно?

Ответ 1

Чтобы использовать SSL, вы должны изменить свой протокол от SMTP до SMTPS, изменив

trnsport = session.getTransport("smtp");

к

trnsport = session.getTransport("smtps");

Ответ 2

Создайте Java Doc:

Обратите внимание, что если вы используете протокол "smtps" для доступа к SMTP через SSL, все свойства будут называться "mail.smtps. *".

Ответ 3

Попробуйте

props.put("mail.smtp.auth", "true");
props.setProperty("mail.smtp.**ssl.enable", "true");
props.setProperty("mail.smtp.**ssl.required", "true");

Ответ 4

Я бы предложил использовать Apache commons-email. Он имеет сеттеры для наиболее часто используемых свойств (включая SSL/TLS) и более дружелюбен к использованию и помещает ontop API JavaMail.

Обновление: я смотрел код commons-email и видел следующие строки:

properties.setProperty("mail.smtp.starttls.enable", this.tls);
properties.setProperty("mail.smtp.auth", "true");

поэтому попробуйте эти свойства.

Ответ 5

Это из документа SSLNOTES из JavaMail (выделено мной):

Во-первых, и, возможно, самое простое - установить свойство, позволяющее использовать SSL. Например, чтобы разрешить использование SSL для SMTP-подключений, установите свойство "mail.smtp.ssl.enable" на "true".

В качестве альтернативы вы можете настроить JavaMail для использования одного из SSL-enabled имена протоколов. В дополнение к протоколам JavaMail, отличным от SSL, "imap", "pop3" и "smtp", протоколы "imaps", "pop3s" и "smtps" могут использовать для подключения к соответствующим службам с использованием SSL соединение.

- поддержка STARTTLS

Поддержка STARTTLS доступна в стандартных "imap" и "smtp", протоколов, но должны быть включены путем установки соответствующего свойства, mail.imap.starttls.enable или mail.smtp.starttls.enable, на "true". Если установлено, если сервер поддерживает команду STARTTLS, это будет используется после подключения и перед отправкой любого входа информация.

Поэтому при использовании поддержки STARTTLS кажется, что нет необходимости устанавливать протокол на smtps.