【问题标题】:Why does connecting with credentials over SMTP not perform authentication?为什么通过 SMTP 使用凭据连接不执行身份验证?
【发布时间】:2021-06-04 22:54:22
【问题描述】:

在尝试使用 JavaFX 和 Jakarta Mail 构建电子邮件客户端时,我想实施连接测试以确保用户输入的凭据实际上适用于他们指定的 IMAP 和 SMTP 服务器。到目前为止,我在验证 IMAP 凭据方面没有任何问题。

对于我的SMTP验证码,我在网上搜索了一个可行的方法,偶然发现this question并在我的项目中实现如下:

public static boolean canConnectViaSmtp (String host, int port, String username, String password) {
        Properties properties = new Properties ();
        properties.put ("mail.smtp.auth", true);
        properties.put ("mail.smtp.starttls.enable", true);
        properties.put ("mail.debug", true);

        Session session = Session.getInstance (properties, null);
        session.setDebug (true);
        session.setDebugOut (System.out);
        Transport transport;

        try {
            transport = session.getTransport ("smtp");
        } catch (NoSuchProviderException e) {
            System.err.println ("Could not connect to smtp://" + host + ":" + port + ", Jakarta Mail is missing the SMTP provider");
            e.printStackTrace ();
            return false;
        }

        try {
            transport.connect (host, port, username, password);
            transport.close ();
        } catch (AuthenticationFailedException e) {
            System.err.println ("Credentials for smtp://" + host + ":" + port + " invalid");
            return false;
        } catch (MessagingException e) {
            System.err.println ("Could not connect to smtp://" + host + ":" + port + ", Jakarta Mail is reporting an error");
            e.printStackTrace ();
            return false;
        }

        return true;
}

我上面链接的问题似乎表明这应该验证凭据是否有效。但是,到目前为止,我已经尝试了两台受我控制的 SMTP 服务器,但两次连接尝试都没有返回 false,而且我可以保证它不起作用。

在 Jakarta Mail 调试输出中,我也没有看到任何尝试执行 SMTP AUTH(日志缩写):

DEBUG: setDebug: Jakarta Mail version 2.0.0
DEBUG: getProvider() returning jakarta.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtpserver", port 25, isSSL false
... pre-STARTTLS communication ...
STARTTLS
220 TLS go ahead
EHLO mymachine
250-smtpserver Hello mymachine
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250 HELP
DEBUG SMTP: Found extension "SIZE", arg "52428800"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "HELP", arg ""
QUIT
221 smtpserver closing connection

虽然我尝试查看 Jakarta Mail 代码,但我没有时间投入尝试在所有抽象层中彻底理解它。这引出了我的问题:是否可以通过 Jakarta Mail 验证 SMTP 凭据?如果可以,如何验证?

【问题讨论】:

    标签: java jakarta-mail smtp-auth


    【解决方案1】:

    从 EHLO 响应来看,您的服务器未配置为通告 SMTP authentication extension (RFC 4954)

    然后客户端不会发送凭据(因为服务器无论如何都不会理解它们)。

    您应该在服务器的响应中看到类似这样的内容:

    250-AUTH GSSAPI DIGEST-MD5
    

    RFC 4954 节选:

    AUTH EHLO 关键字包含一个以空格分隔的参数作为参数 可用 [SASL] 机制的名称列表。名单 成功的 STARTTLS 后可用的机制可能会改变 命令 [SMTP-TLS]。

    【讨论】:

    • 从技术上讲,服务器配置为支持身份验证,因为我不允许在没有正确凭据的情况下发送邮件。但是,我没有注意我使用的端口,因此最终选择了没有宣传它的端口。所以这是我的错,不是 Jakarta Mail 的错。
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2013-12-12
    • 2020-01-28
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 2020-04-09
    • 2018-03-25
    相关资源
    最近更新 更多