Я не могу понять, чего мне не хватает в конфигурации 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", как и ожидалось.
Чего мне не хватает?
Что мне не хватает?