我无法理解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,邮件。 host = 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”读取了属性。 我想念的是什么?
我缺少什么?
答案 0 :(得分:0)
属性名称必须与您传递给Session.getTransport或Session.getStore的协议名称匹配。如您所见,Transport.send根据消息中使用的地址类型选择协议(几乎总是“ rfc822”,因此也就是“ smtp”协议)。您可以根据需要将地址类型更改为协议类型,但更简单的方法是仅设置“ smtp”协议的属性。而且,如果您要设置mail.smtp.ssl.trust
属性,则无需使用MailSSLSocketFactory。
此外,您使用的JavaMail版本非常旧。 current version is 1.6.2,请升级。