当前位置: 首页 > 知识库问答 >
问题:

为什么通过SMTP使用凭据连接不执行身份验证?

太叔高义
2023-03-14

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

对于我的SMTP验证代码,我在internet上搜索了一个可行的方法,遇到了这个问题,并在我的项目中实现了它,如下所示:

java prettyprint-override">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邮件调试输出中,我也没有看到任何试图执行SMTP身份验证(日志缩写)的尝试:

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邮件代码,但我没有时间在所有抽象层中彻底理解它。这就引出了我的问题:是否可以通过雅加达邮件验证SMTP凭据,如果可以,如何验证?

共有1个答案

房星光
2023-03-14

从EHLO响应来看,您的服务器没有配置为发送SMTP身份验证扩展。

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

您应该在服务器响应中看到如下内容:

250-AUTH GSSAPI DIGEST-MD5

RFC节选:

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

 类似资料:
  • 我对社交网络分析和twitter api是新手。我想收集关于特定主题的tweets。所以我写了下面的代码 在我的程序中,我需要在哪里提供凭据 谢谢

  • 我正在尝试使用Apache Flume将推文保存到HDFS。我目前在Hadoop和Flume中使用Cloudera图像。我在Cloudera的博客上学习教程,但我无法连接到Twitter API。 我收到以下错误: 我已经将我的twitter API凭证复制到flume.conf中(我已经在光盘和web用户界面上进行了尝试)。我也曾试图重新生成它们,并复制那些新的,但这对我没有帮助。 我的pom。

  • 我正在运行带有公开WebSocketendpoint的服务器。下面是我的: 问题是如何使用或或查询参数实现建立WS连接的身份验证? 更好的选择是避免使用Spring Security。 多谢了。

  • 问题内容: 我正在尝试使用kerberos / HTTP主机进行身份验证。使用Apache HttpClient作为我的客户端- 以及此源的略微修改版本。 我的Kerberos身份验证非常顺利,我希望知道如何以编程方式设置登录凭据。目前,凭据是通过控制台手动输入的,但是我想在运行时选择它。[实际上,正如我希望对大量用户进行自动化和负载测试的服务器。]。 编辑:这是相关部分的代码片段: 该接口有两种

  • 问题内容: sqlalchemy是Python的数据库连接模块,默认情况下使用SQL身份验证(数据库定义的用户帐户)。如果要使用Windows(域或本地)凭据对SQL Server进行身份验证,则必须更改连接字符串。 默认情况下,按照sqlalchemy的定义,连接到SQL Server的连接字符串如下: 如果使用您的Windows凭据使用,则会引发类似于以下的错误: 在此错误消息中,代码1845