Устранение неполадок "Сервер совершил нарушение протокола" при отправке почты с SmtpClient - PullRequest
6 голосов
/ 04 марта 2010

Я хочу отправить сообщение с классом 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

Я не могу найти причину для этого. Пожалуйста, если кто-то сталкивался с чем-то подобным, скажите мне, что делать.

Ответы [ 8 ]

7 голосов
/ 09 марта 2014

У меня была такая же проблема, в моем случае это была установка user @ domain вместо user, я имею в виду

Старый код

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

Новый код

new NetworkCredential("UserName", "Password");
5 голосов
/ 11 ноября 2010

Мне кажется, что аутентификация SmtpClient выходит из-под контроля.

Некоторые механизмы аутентификации: «Клиент: запрос авторизации с именем пользователя и паролем, Сервер: успех / сбой», другие - «Клиент: запрос аутентификации»с именем пользователя, Сервер: запрос пароля, Клиент: ответ с паролем, Сервер: успех / сбой ".

Похоже, что SmtpClient ожидает первое, а ваш сервер ожидает последнее.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.что сервер предлагает несколько вариантов аутентификации, а клиент выбирает, какой из них он собирается использовать.Поведение оттуда должно определяться выбранным протоколом.Хотелось бы надеяться, что класс SmtpClient позаботился об этом за вас, но я боюсь, что никогда не использовал этот конкретный класс.

Также помните - если вы собираетесь публиковать здесь журнал, измените наодноразовый пароль перед входом в сеанс, так как обычный кодированный пароль base64 может быть тривиально изменен на простой для чтения простой текстовый пароль.

4 голосов
/ 04 марта 2010

UGFzc3dvcmQ6 - это «Password:» base 64, закодированный (без кавычек), что означает, что пароль, вероятно, неверный или не закодирован для отправки. Попробуй base 64 с кодировкой пароля:

string password = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("Password));
2 голосов
/ 05 марта 2010

Включить ведение журнала для System.Net.Mail. Затем просмотрите файл журнала. Это покажет вам точно, что происходит во время уровня SMTP.

Вот ссылка с дополнительной информацией:

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

1 голос
/ 15 июня 2016

Была такая же проблема.Решил это в следующих шагах: 1) выяснить, что сервер предлагает для SMTP-аутентификации, подключившись к SMTP-серверу с помощью Telnet или замазки или любого другого терминала:

telnet xxx.yyy.zzz.aaa 587 

(xxx.yyy.zzz.aaa = IP-адрес SMTP-сервера, 587 = номер порта)

<Сервер отвечает «220 протокол + версия + время» </p>

ehlo testing

<Сервер отображает список возможностей, например </p>

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.

С взломом (см. 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);
1 голос
/ 04 марта 2010

тысяча обращений в Google за UGFzc3dvcmQ6

похоже сервер ожидает зашифрованное (с base64) имя пользователя / пароль

0 голосов
/ 27 июля 2018

Для всех, кто сталкивался с этим в Google .. Я исправил это, указав свое имя пользователя в формате "username" вместо "DOMAIN \ username"

$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
0 голосов
/ 17 июня 2015

Это также может произойти, если вы просто не предоставите пароль. В моем случае я использовал учетные данные из блока smtp web.config и на моем сервере развертывания (с использованием развертывания осьминога) забыл заполнить атрибут пароля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...