Отправка электронной почты через ядро ​​.net в Ubuntu возвращает ошибку base64 - PullRequest
1 голос
/ 09 мая 2019

У меня ошибка при попытке отправить электронное письмо через мой тестовый сервер, который работает на Ubuntu 16.04.У меня есть профессиональная учетная запись на OVH, и я использую этот smtp:

pro1.mail.ovh.net

Когда я нахожусь на отладке на моей рабочей станции, работающей на Windows 10, я могу отправить свою электронную почту.

Вот мой код:

      var smtp = m_emailConfiguration["Smtp"];
      var email = m_emailConfiguration["Email"];
      var password = m_emailConfiguration["Password"];

      try
      {              
        using (var smtpClient = new SmtpClient(smtp, 587))
        {
          var mailMessage = new MailMessage(email, mailTo, subject, body);

          smtpClient.UseDefaultCredentials = false;
          smtpClient.Credentials = new NetworkCredential(email, password);
          smtpClient.EnableSsl = true;               
          smtpClient.Send(mailMessage);              
        }
      }
      catch (Exception ex)
      {
        throw new Exception(ex.InnerException.Message);
      }

У меня появляется эта ошибка:

The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters

Полная трассировка стека:

Exception: System.Net.Mail.SmtpException: Failure sending mail. ---> System.FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.
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)

Я нашел кого-то, у кого такая жепроблема: Отправка почты через .net core smtpClient: SmtpException / FormatException

Но его проблема заключалась в пароле, я уверен, что мой пароль правильный.

Так жеесть кто-то, чья идея?

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Как сказал Панагиотис Канавос в комментариях, SmtpClient устарел.Вместо этого я использую MailKit, и теперь он работает нормально.

0 голосов
/ 09 мая 2019

Давайте поместим все комментарии в ответ.

Не используйте SmptClient.Вместо этого используйте MailKit . SmtpClient устарел, а сама Microsoft рекомендует , используя MailKit или другую библиотеку.

Стек вызовов показывает, что при попытке аутентификации возникла ошибкаиспользуя Windows аутентификацию.Это явно неправильно в этом случае, но ошибка, вероятно, не будет исправлена ​​именно потому, что класс устарел.

Пример Отправка сообщений показывает, насколько легко отправлять сообщения:

using (var client = new SmtpClient ()) {
    // For demo-purposes, accept all SSL certificates (in case the server supports STARTTLS)
    client.ServerCertificateValidationCallback = (s,c,h,e) => true;

    client.Connect ("smtp.friends.com", 587, false);

            // Note: only needed if the SMTP server requires authentication
    client.Authenticate ("joey", "password");

    client.Send (message);
    client.Disconnect (true);
}

MailKit построен поверх MimeKit, что означает, что он может легко создавать сложные сообщения.Копируя из другого примера , вы можете использовать служебный класс BodyBuilder для создания сообщения, содержащего как текстовое тело, так и тело HTML с изображениями.

        var message = new MimeMessage ();
        message.From.Add (new MailboxAddress ("Joey", "joey@friends.com"));
        message.To.Add (new MailboxAddress ("Alice", "alice@wonderland.com"));
        message.Subject = "How you doin?";

        var builder = new BodyBuilder ();

        // Set the plain-text version of the message text
        builder.TextBody = @"Hey Alice,
....
-- Joey
";

        // In order to reference selfie.jpg from the html text, we'll need to add it
        // to builder.LinkedResources and then use its Content-Id value in the img src.
        var image = builder.LinkedResources.Add (@"C:\Users\Joey\Documents\Selfies\selfie.jpg");
        image.ContentId = MimeUtils.GenerateMessageId ();

        // Set the html version of the message text
        builder.HtmlBody = string.Format (@"<p>Hey Alice,<br>
....
<p>-- Joey<br>
<center><img src=""cid:{0}""></center>", image.ContentId);

        // We may also want to attach a calendar event for Monica's party...
        builder.Attachments.Add (@"C:\Users\Joey\Documents\party.ics");

        // Now we just need to set the message body and we're done
        message.Body = builder.ToMessageBody ();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...