遇到了同样的问题。通过以下步骤解决了它:
1) 通过使用 Telnet 或 putty 或任何其他终端连接到 SMTP 服务器,找出服务器为 SMTP 身份验证提供的功能:
telnet xxx.yyy.zzz.aaa 587
(xxx.yyy.zzz.aaa = SMTP 服务器的 IP 地址,587 = 端口号)
ehlo testing
250-AUTH NTLM CRAM-MD5 LOGIN
SMTP 客户端尝试首先采用最安全的协议。就我而言:
1. System.Net.Mail.SmtpNegotiateAuthenticationModule
2. System.Net.Mail.SmtpNtlmAuthenticationModule
3. System.Net.Mail.SmtpDigestAuthenticationModule
4. System.Net.Mail.SmtpLoginAuthenticationModule
看起来好像 SMTP 客户端尝试 NTLM,而服务器尝试运行 LOGIN。
通过 hack(参见https://blogs.msdn.microsoft.com/knom/2008/04/16/hacking-system-net-mail-smtpclient/),可以关闭所有协议,除了服务器假定的协议(在这种情况下为登录):
FieldInfo transport = smtpClient.GetType().GetField("transport", BindingFlags.NonPublic | BindingFlags.Instance);
FieldInfo authModules = transport.GetValue(smtpClient).GetType().GetField("authenticationModules",BindingFlags.NonPublic | BindingFlags.Instance);
Array modulesArray = authModules.GetValue(transport.GetValue(smtpClient)) as Array;
foreach (var module in modulesArray)
{
Console.WriteLine(module.ToString());
}
// System.Net.Mail.SmtpNegotiateAuthenticationModule
// System.Net.Mail.SmtpNtlmAuthenticationModule
// System.Net.Mail.SmtpDigestAuthenticationModule
// System.Net.Mail.SmtpLoginAuthenticationModule
// overwrite the protocols that you don't want
modulesArray.SetValue(modulesArray.GetValue(3), 0);
modulesArray.SetValue(modulesArray.GetValue(3), 1);
modulesArray.SetValue(modulesArray.GetValue(3), 2);