javamail возвращая smtp в качестве транспорта, вместо smtps

Я установил для свойства mail.transport значение smtps, кроме основной информации для подключения к серверу smtps:

    Properties p = new Properties();
    p.put("mail.transport.protocol", "smtps");
    p.put("mail.smtps.host", "smtp.gmail.com");
    p.put("mail.smtps.auth", true);

    Session s = Session.getDefaultInstance(p,new Authenticator(){/*authenticator impl.*/});

    MimeMessage mm = new MimeMessage(s); /*then i set the subject, then the body... */
    mm.setRecipients(RecipientType.TO, "myfakeaddress@gmail.com");

И сейчас я пытаюсь отправить свое сообщение. Я хочу попробовать статический метод; используя метод экземпляра sendMessage это работает отлично. Вот:

    Transport.send(mm);

Он пытается подключиться к серверу SMTP, а не серверу SMTP. Шагнув внутрь реализации javamail (кстати, моя версия 1.4.5), я обнаружил, что метод, который терпит неудачу:

 transport = s.getTransport(addresses[0]);

потому что это возвращает SMTPTransport вместо SMTPSSLTransport; это даже если я установил mail.transport.protocol свойство smtps, как вы можете видеть во второй строке кода. Моя процедура глючит где-либо или нет возможности отправлять SMTP-сообщения через Transport.send статический метод?

2 ответа

Transport.send(msg) ищет протокол (ы), связанные с получателями вашей электронной почты, для каждого типа получателей.

Все ваши получатели InternetAddress ES, которые имеют тип rfc822

Вот три способа настроить JavaMail на использование протокола smtps для адресов rfc822:

  1. Добавьте строку rfc822=smtps в файлах свойств javamail.address.map или же javamail.default.address.map (как описано в Session Javadoc)
  2. Вызов s.setProtocolForAddress("rfc822", "smtps") `в вашем конкретном сеансе (требуется JavaMail 1.4 или новее)
  3. Установить свойство mail.transport.protocol.rfc822 в smtps при создании экземпляра вашего сеанса (требуется JavaMail 1.4.3 или более поздняя версия)

Bill Shannon (текущий сопровождающий Javamail) предлагает в этом вопросе

Избавиться от всех свойств фабрики сокетов; Если вы используете достаточно свежую версию JavaMail, они вам не нужны. См. FAQ по JavaMail, чтобы узнать, как настроить JavaMail для доступа к Gmail. Вы также найдете там советы по отладке, если они все еще не работают.

Также измените Session.getDefaultInstance на Session.getInstance.

Вот соответствующий код из FAQ по Javamail

String host = "smtp.gmail.com";
String username = "user";
String password = "passwd";

Properties props = new Properties();
props.put("mail.smtps.auth", "true");
props.put("mail.debug", "true");

MimeMessage msg = new MimeMessage(session);
// set the message content here

Transport t = session.getTransport("smtps");

try {
  t.connect(host, username, password);
  t.sendMessage(msg, msg.getAllRecipients());
} finally {
  t.close();
}
Другие вопросы по тегам