如何通过用户名进行身份验证并传入 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