有同样的问题。通过以下步骤解决它:1)通过使用 Telnet 或 putty 或任何其他终端连接到 SMTP 服务器,找出服务器为 SMTP 身份验证提供的服务:
telnet xxx.yyy.zzz.aaa 587
(xxx.yyy.zzz.aaa = SMTP 服务器的 IP 地址,587 = 端口号)
< 服务器回答“220协议+版本+时间”
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/),可以关闭除服务器之外的所有协议假设(在这种情况下为 LOGIN):
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);