8

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

我找不到原因。请,如果有人遇到过这样的事情,请告诉我该怎么做。

4

8 回答 8

8

我有同样的问题,我的意思是设置 user@domain 而不是 user

旧代码

new NetworkCredential("UserName@domain.com", "Password");

新代码

new NetworkCredential("UserName", "Password");
于 2014-03-09T10:49:58.440 回答
5

在我看来,这看起来像是 SmtpClient 身份验证以某种方式脱节。

一些身份验证机制是“客户端:使用用户名和密码请求身份验证,服务器:成功/失败”其他是“客户端:使用用户名请求身份验证,服务器:请求密码,客户端:使用密码回复,服务器:成功/失败”。

看起来 SmtpClient 期待前者,而您的服务器期待后者。

正如dave gota 所建议的那样,会话日志会告诉您 SmtpClient 尝试使用的身份验证机制,但它也会说明服务器支持的身份验证机制。

通常发生的情况是服务器提供了许多身份验证选项,客户端选择要使用的身份验证选项。那里的行为应该由选择的协议决定。我希望 SmtpClient 类可以为您解决这个问题,但恐怕我从未使用过那个特定的类。

还请记住 - 如果您要在此处发布日志,请在登录会话之前更改为一次性密码,因为 base64 编码的纯文本密码可以很容易地更改回人类可读的纯文本密码。

于 2010-11-11T16:21:56.617 回答
4

UGFzc3dvcmQ6 是“密码:”base 64 编码(不带引号),这意味着密码可能错误或未发送编码。尝试使用 base 64 编码密码:

string password = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("Password));
于 2010-03-04T15:52:22.263 回答
2

为 System.Net.Mail 启用日志记录。然后查看日志文件。这将准确地向您展示 SMTP 层期间发生的情况。

这是一个包含更多信息的链接:

http://systemnetmail.com/faq/4.10.aspx

于 2010-03-05T13:35:05.857 回答
1

UGFzc3dvcmQ6在谷歌上的点击量达到数千

似乎服务器期望加密(使用base64)用户名/密码

于 2010-03-04T15:42:40.227 回答
1

有同样的问题。通过以下步骤解决它: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);
于 2016-06-15T17:28:46.207 回答
0

当您根本不提供密码时,也会发生这种情况。在我的情况下,我使用来自 web.config smtp 块的凭据,并且在我的部署服务器上(使用 octopus deploy)忘记了填充密码属性。

于 2015-06-17T18:22:39.143 回答
0

对于在谷歌上遇到此问题的任何其他人。我通过以“用户名”格式而不是“域\用户名”提供我的用户名来解决此问题

$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
于 2018-07-27T10:15:03.533 回答