我想发送一封包含SmtpClient
类的邮件。
这是我使用的代码:
SmtpClient smtpClient = new SmtpClient("Host",25);
NetworkCredential basicCredential =
new NetworkCredential("UserName", "Password");
MailMessage message = new MailMessage();
MailAddress fromAddress = new MailAddress("me@domain.com");
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = basicCredential;
message.From = fromAddress;
message.Subject = "test send";
message.IsBodyHtml = true;
message.Body = "<h1>hello</h1>";
message.To.Add("mail@domain.com");
smtpClient.Send(message);
但它总是抛出异常:
服务器提交协议违规服务器响应为:UGFzc3dvcmQ6
我找不到原因。如果有人遇到这样的事情,请告诉我该怎么做。
答案 0 :(得分:7)
我遇到了同样的问题,因为我的情况是设置用户@域而不是用户,我的意思是
旧代码
new NetworkCredential("UserName@domain.com", "Password");
新代码
new NetworkCredential("UserName", "Password");
答案 1 :(得分:5)
在我看来,SmtpClient身份验证在某种程度上是不合时宜的。
一些身份验证机制是“客户端:使用用户名和密码请求身份验证,服务器:成功/失败”其他人是“客户端:使用用户名请求身份验证,服务器:请求密码,客户端:使用密码回复,服务器:成功/失败”
看起来SmtpClient期待前者,而你的服务器期待后者。
作为dave wenta suggested,会话日志会告诉您SmtpClient尝试使用的auth机制,但它也会说明服务器支持的auth机制。
通常情况下,服务器提供了许多验证选项,客户端会选择要使用的验证选项。那里的行为应该由所选择的协议决定。我希望SmtpClient课程能为你解决这个问题,但我担心我从未使用过那个特定课程。
还记得 - 如果您要在此处发布日志,请在登录会话之前更改为一次性密码,因为base64编码的纯文本密码可以简单地更改回人类可读的纯文本密码。
答案 2 :(得分:4)
UGFzc3dvcmQ6是“密码:”base 64编码(没有引号),表示密码可能错误或未发送编码。尝试使用base 64编码密码:
string password = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("Password));
答案 3 :(得分:2)
启用System.Net.Mail的日志记录。然后查看日志文件。这将显示SMTP层中发生的确切内容。
这是一个包含更多信息的链接:
答案 4 :(得分:1)
thousand of hit on google for UGFzc3dvcmQ6
似乎服务器期望加密(使用base64)用户名/密码
答案 5 :(得分:1)
有同样的问题。通过以下步骤解决了这个问题: 1)通过使用Telnet或putty或任何其他终端连接到SMTP服务器,找出服务器为SMTP身份验证提供的内容:
telnet xxx.yyy.zzz.aaa 587
(xxx.yyy.zzz.aaa = SMTP服务器的IP地址,587 =端口号)
&LT;服务器以&#34; 220协议+版本+时间&#34;
回答ehlo testing
&LT;服务器显示功能列表,例如
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
当服务器尝试运行LOGIN时,看起来好像SMTP客户端尝试NTLM。
使用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);
答案 6 :(得分:0)
如果您只是提供密码,也会发生这种情况。在我的情况下,我使用来自web.config smtp块的凭据,并且在我的部署服务器上(使用章鱼部署)忘记填充密码属性。
答案 7 :(得分:0)
对于在Google上遇到此问题的其他人。我通过以“用户名”格式而不是“ DOMAIN \用户名”格式提供用户名来解决了此问题
$Credential = Get-Credential
Send-MailMessage -SmtpServer exchange.contoso.com -Credential $Credential -From 'user@contoso.com' -To 'recipient@domain.com' -Subject 'Test email' -Port 587 -UseSsl