Путаница в имени протокола SMTP в свойствах Javamail - PullRequest
0 голосов
/ 03 сентября 2018

Я не могу понять, чего мне не хватает в конфигурации Javamail. Я немного озадачен «протокольной» частью ключа свойств.

Это мой SMTP-код:

public Session getSendSession(){
        Properties props = new Properties();
        String protocol="smtps";
        props.put("mail.host", "smtp.myserver.com");
        props.put("mail.transport.protocol", protocol);
        props.put("mail."+protocol+".port", 587);
        if(protocol!=null && protocol.toLowerCase().endsWith("s")){
            props.put("mail."+protocol+".ssl.enable","true");
            try {
                MailSSLSocketFactory sf = new MailSSLSocketFactory();
                sf.setTrustAllHosts(true);
                props.put("mail."+protocol+".ssl.socketFactory", sf);
            } catch (GeneralSecurityException e) {
                throw new SystemException(e);
            }
            props.put("mail."+protocol+".ssl.trust","*");
        }
        props.put("mail."+protocol+".auth", "true");
        Session mailSession= Session.getInstance(props, 
            new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("test@myserver.com","test");
                }
            });
        mailSession.setDebug(true);
        return mailSession;
    }

Это отладочный вывод Props:

{mail.smtps.ssl.enable = true, mail.transport.protocol = smtps, mail.smtps.port = 587, mail.smtps.ssl.trust = *, mail.smtps.auth = true, mail. host = smtp.myserver.com, mail.smtps.ssl.socketFactory=com.sun.mail.util.MailSSLSocketFactory@cfa4b2 Event

С этой конфигурацией я получил отладочный вывод:

DEBUG: setDebug: JavaMail version 1.4.7
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.myserver.com", port 25, isSSL false

Как видите, конфигурация ssl и порта игнорируется!


Если я изменю часть протокола каждого свойства просто «smtp» (без «s»), то соединение будет успешным:

public Session getSendSession(){
    Properties props = new Properties();
    String protocol="smtps";
    props.put("mail.host", "smtp.myserver.com");
    props.put("mail.transport.protocol", protocol);
    props.put("mail.smtp.port", 587);
    if(protocol!=null && protocol.toLowerCase().endsWith("s")){
        props.put("mail.smtp.ssl.enable","true");
        try {
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            props.put("mail.smtp.ssl.socketFactory", sf);
        } catch (GeneralSecurityException e) {
            throw new SystemException(e);
        }
        props.put("mail.smtp.ssl.trust","*");
    }
    props.put("mail.smtp.auth", "true");
    Session mailSession= Session.getInstance(props, 
        new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("test@myserver.com","test");
            }
        });
    mailSession.setDebug(true);
    return mailSession;
}

Отладка реквизита:

{mail.smtp.port=587, mail.smtp.ssl.trust=*, mail.transport.protocol=smtps, mail.smtp.auth=true, mail.smtp.ssl.enable=true, mail.host=smtp.myserver.com, mail.smtp.ssl.socketFactory=com.sun.mail.util.MailSSLSocketFactory@45760}

Отладочный вывод:

DEBUG: setDebug: JavaMail version 1.4.7
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.myserver.com", port 587, isSSL true

Я также заглянул в источник javamail и, похоже, что свойства читаются с "mail." + (Protocol / name) + ". Value", как и ожидалось. Чего мне не хватает?

Что мне не хватает?

1 Ответ

0 голосов
/ 05 сентября 2018

Имена свойств должны соответствовать имени протокола, который вы передаете в Session.getTransport или Session.getStore. Как вы обнаружили, Transport.send выбирает протокол на основе типов адресов, используемых в сообщении (почти всегда «rfc822» и, следовательно, протокол «smtp»). При необходимости вы можете изменить отображение с типа адреса на протокол, но более простой подход состоит в том, чтобы просто установить свойства для протокола «smtp». И вам не нужно использовать MailSSLSocketFactory, если вы устанавливаете свойство mail.smtp.ssl.trust.

Кроме того, вы используете очень старую версию JavaMail. Текущая версия - 1.6.2 , обновите, если возможно.

...