如何通过用户名进行身份验证并传入 MailKit?

Posted

技术标签:

【中文标题】如何通过用户名进行身份验证并传入 MailKit?【英文标题】:How can I Authenticate by username and pass in MailKit? 【发布时间】:2022-01-03 03:06:52 【问题描述】:

我正在使用 Mailkit 在我的 asp.net core 3.1 应用程序中发送邮件。 我可以使用我的谷歌帐户连接和验证。但是当我转而使用我的企业帐户时,我无法使用 starttls 选项和以下代码进行身份验证:

                client.CheckCertificateRevocation = false;
                client.Connect(  Host,25, SecureSocketOptions.StartTls);
                client.Authenticate(new NetworkCredential(Username, Password));

结果为“535: 5.7.3 Authentication unsuccessful”。 但是,我可以使用以下代码使用 .net smtpclient 进行连接:

                var smtpclient= new System.Net.Mail.SmtpClient();
                ServicePointManager.ServerCertificateValidationCallback =ValidateServerCertificate
                smtpclient.Host = Host;
                smtpclient.Port = 25;
                smtpclient.EnableSsl = true;
                var cred= new System.Net.NetworkCredential();
                cred.UserName =Username;
                cred.Password = Password;
                smtpclient.Credentials = cred;
                smtpclient.DeliveryMethod = SmtpDeliveryMethod.Network;
                smtpclient.Send(message);
如果我从用户名中删除了域名,我可以进行身份​​验证,但不能启动 starttls 模式。 我可以使用 starttls 匿名连接。

那么我该如何解决这个问题呢? 这是我的日志示例:

Connected to smtp://ip:25/?starttls=always
S: 220 xxxxxxx Microsoft ESMTP MAIL Service ready at dt

C: EHLO [ip]

S: 250-xxxx Hello [ip]

S: 250-SIZE 104857600

S: 250-PIPELINING

S: 250-DSN

S: 250-ENHANCEDSTATUSCODES

S: 250-STARTTLS

S: 250-X-ANONYMOUSTLS

S: 250-AUTH NTLM LOGIN

S: 250-X-EXPS GSSAPI NTLM

S: 250-8BITMIME

S: 250-BINARYMIME

S: 250-CHUNKING

S: 250 XRDST

【问题讨论】:

编辑您的问题。显示您正在使用的代码,删除您不使用的代码。显示错误信息。提供有关您正在连接的内容(O365、Exchange 等)的详细信息。你的问题提到了谷歌。谷歌授权与微软不同。 Google 部分没有相关性。 我帖子中的代码是我正在使用的代码。我无法使用凭据进行身份验证,但是我可以匿名身份验证。我不知道Mailkit或smtp服务器的这个问题是否不支持身份验证?为什么 .net smtpclient 使用凭据进行身份验证? 【参考方案1】:

众所周知,MailKit 2.x(包括 2.15)的 NTLM 身份验证实现无法在所有情况下正常工作。

您可以尝试这样做以确保 MailKit 不使用 NTLM:

client.AuthenticationMechanisms.Remove ("NTLM");
client.Authenticate (username, password);

或者您可以像这样主动强制使用特定的身份验证机制:

client.Authenticate (new SaslMechanismLogin (username, password));

如果这不起作用,可能是因为您的用户名/密码错误,或者服务器刚刚配置为拒绝登录身份验证。

即将发布的 MailKit v3.0 版本具有适用于所有情况的有效 NTLM 实现。

【讨论】:

以上是关于如何通过用户名进行身份验证并传入 MailKit?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OAuth 2.0 通过 Azure Active Directory 对用户进行身份验证?

通过不同域上的 REST Web 服务进行用户身份验证 - asp.net

使用 Kong 进行身份验证

愚公系列2023年02月 .NET CORE工具案例-使用MailKit使用SMTP协议进行邮件发送

WCF 身份验证

如何使用 Starscream 对用户进行身份验证