Javamail SMTP属性协议名称混淆

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javamail SMTP属性协议名称混淆相关的知识,希望对你有一定的参考价值。

我无法理解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;
    }

这是道具的调试输出:

{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}

通过这种配置,我得到了这个调试输出:

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。”+(协议/名称)+“。value”按预期读取的。我错过了什么?

我错过了什么?

答案

属性名称需要与传递给Session.getTransport或Session.getStore的协议名称匹配。正如您所发现的,Transport.send根据消息中使用的地址类型选择协议(几乎总是“rfc822”,因此也就是“smtp”协议)。如果需要,可以将映射从地址类型更改为协议,但更简单的方法是仅为“smtp”协议设置属性。如果您正在设置mail.smtp.ssl.trust属性,则不需要使用MailSSLSocketFactory。

此外,您使用的是非常旧版本的JavaMail。 current version is 1.6.2,请尽可能升级。

以上是关于Javamail SMTP属性协议名称混淆的主要内容,如果未能解决你的问题,请参考以下文章

JavaMail邮件发送

JavaMail邮件发送

JavaMail使用SMTP协议发送电子邮件(详解)

java中使用javamail发送邮件

Java编程系列使用JavaMail通过SMTP协议发送局域网(内网)邮件

使用JavaMail连接邮件发送服务器smtp