Отправка почты через .net core smtpClient: SmtpException / FormatException - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь отправлять письма через SmtpClient в ядре .net.По сути, я просто переношу старый код .net framework в ядро ​​.net.В старой системе это делается следующим образом:

using (var smtpClient = new SmtpClient("smtp.xyz.de", 587))
{
   smtpClient.UseDefaultCredentials = false;
   smtpClient.Credentials = new System.Net.NetworkCredential("user", "password", "domain");
   smtpClient.EnableSsl = true;
   smtpClient.Send(mailMessage);
}

Этот код работает нормально.

Теперь я перенес этот код в ядро ​​.net, как показано ниже:

 using (var smtpClient = new SmtpClient("smtp.xyz.de", 587))
 {
    smtpClient.UseDefaultCredentials = false;
    smtpClient.Credentials = new NetworkCredential("user", "password", "domain");
    smtpClient.EnableSsl = true;  
    smtpClient.Send(mailMessage);
 }

Первая проблема заключается в том, что я получаю сообщение об ошибке:

Входне является допустимой строкой Base-64, так как содержит не базовый 64-символ, более двух символов заполнения или недопустимый символ среди символов заполнения.

Трассировка стека:

   at System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength)
   at System.Convert.FromBase64String(String s)
   at System.Net.Mail.SmtpNegotiateAuthenticationModule.GetSecurityLayerOutgoingBlob(String challenge, NTAuthentication clientContext)
   at System.Net.Mail.SmtpNegotiateAuthenticationModule.Authenticate(String challenge, NetworkCredential credential, Object sessionCookie, String spn, ChannelBinding channelBindingToken)
   at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
   at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
   at System.Net.Mail.SmtpClient.GetConnection()
   at System.Net.Mail.SmtpClient.Send(MailMessage message)

Из-за этой ошибки я попытался преобразовать строки пользователя и пароля в Base64, как показано ниже:

using (var smtpClient = new SmtpClient("smtp.xyz.de", 587))
{
   var userEncoded = Convert.ToBase64String(Encoding.UTF8.GetBytes("user"));
   var passwordEncoded = convert.ToBase64String(Encoding.UTF8.GetBytes("password"));

   smtpClient.UseDefaultCredentials = false;
   smtpClient.Credentials = new NetworkCredential(userEncoded, passwordEncoded, "domain");
   smtpClient.EnableSsl = true;               
   smtpClient.Send(mailMessage);              
}

При этом я получаю еще одну ошибку:

SMTP-сервертребует безопасного соединения или клиент не прошел проверку подлинности.Ответ сервера: 5.7.1 Клиент не прошел проверку подлинности

Трассировка стека:

   at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)
   at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, MailAddress from, Boolean allowUnicode)
   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, Boolean allowUnicode, SmtpFailedRecipientException& exception)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at MailTest.Program.ProgramStart() in C:\Repos\MailTest\MailTest\Program.cs:line 67

Создание объекта MailMessage:

mailMessage = new MailMessage("sender@xyz.com", "recipient@xyz.com", "subject", "body");

Может кто угодносообразить, что я делаю не так?Для меня код выглядит точно так же, за исключением преобразования в Base64.

1 Ответ

0 голосов
/ 21 января 2019

Я нашел ответ сам:

Это стыдно, и мне стыдно, но во всех тестах я использовал неправильный пароль. Мне это никогда не приходило в голову из-за раздражающего сообщения об ошибке: (

...