【发布时间】:2018-09-03 08:51:52
【问题描述】:
我无法理解我在 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, 邮件。主机=smtp.myserver.com, mail.smtps.ssl.socketFactory=com.sun.mail.util.MailSSLSocketFactory@cfa4b2}
有了这个配置,我得到了这个调试输出:
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”读取的,正如预期的那样。 我错过了什么?
我错过了什么?
【问题讨论】:
-
我没有找到并回答,但我发现 Transport.send() 忽略了 mail.transport.protocol 属性并仅通过邮件地址类型选择其协议,并且总是得到“smtp”。跨度>
标签: email smtp jakarta-mail