.NET gMSA服务无法对Exchange SMTP进行身份验证

编程语言 2026-07-08

我有一个在gMSA(组托管服务账户)下运行的.NET Windows服务。

SMTP服务器是一个云服务器 "hosted on IIS"(传统的IIS SMTP虚拟服务器或在IIS后面的Exchange收件连接器)。匿名身份验证已启用。

向内部的单个用户发送邮件在不进行身份验证的情况下使用MailKit可以正常工作。然而,向Exchange的分发组发送邮件会失败,除非发件人经过身份验证(默认的Exchange行为:分发组需要经过身份验证的发件人)。

如果我尝试进行身份验证,我会得到:

MailKit.Security.AuthenticationException: 504: 5.7.4 Unrecognized authentication type
at MailKit.Net.Smtp.SmtpClient.AuthenticateAsync(SaslMechanism mechanism, CancellationToken cancellationToken)

使用 System.Net.Mail 在使用gMSA之后向内部和分发组发送邮件都失败。当使用普通服务账户时,一切正常。但我们正在迁移到gMSA。

我得到

System.Net.Mail.SmtpException: Failure sending mail.
System.IO.IOException: Unable to read data from the transport connection: The connection was closed.

我的代码长成这样:

using SmtpClient client = new();

await client.ConnectAsync(host, 25, SecureSocketOptions.None, cancellationToken);
SaslMechanismGssapi gssapi = 
    new(System.Net.CredentialCache.DefaultNetworkCredentials);
await client.AuthenticateAsync(gssapi, cancellationToken);

await client.SendAsync(message, cancellationToken);
await client.DisconnectAsync(true, cancellationToken);

解决方案

504: 5.7.4 Unrecognized authentication type 通常意味着你尝试使用的认证机制不被服务器支持。

在你的情况下,这意味着服务器很可能不支持GSSAPI。

有几种方法可以获取服务器支持的认证机制列表:

  1. 通过如下方式实例化SmtpClient来启用日志记录:using SmtpClient client = new(new ProtocolLogger("smtp.log"));,运行你的代码,然后在文本编辑器中查看smtp.log,看看在 EHLO 响应中报告了哪些 AUTH=... 机制。
  2. 你可以访问 client.AuthenticationMechanisms HashSet以查看它包含了哪些值:
Console.WriteLine("Supported AUTH mechanisms: {0}", string.Join(", ", client.AuthenticationMechanisms));

一旦知道哪些是受支持的,就相应地更新代码以使用其中一个。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章