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:
- Добавьте строку
rfc822=smtps
в файлах свойствjavamail.address.map
или жеjavamail.default.address.map
(как описано вSession
Javadoc) - Вызов
s.setProtocolForAddress("rfc822", "smtps")
`в вашем конкретном сеансе (требуется JavaMail 1.4 или новее) - Установить свойство
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();
}