Проблема с отправкой электронной почты с использованием C#

StackOverflow https://stackoverflow.com/questions/801243

  •  03-07-2019
  •  | 
  •  

Вопрос

Когда я пытаюсь отправить электронную почту с помощью C# с smtp-сервером Gmail, я получаю эту ошибку.

«Удаленный сертификат недействителен в соответствии с процедурой проверки».

SSL включен

Используемый порт: 587.

используемое имя сервера — «Smtp.gmail.com».

имя пользователя и пароль верны

Outlook Express отлично работает на том же компьютере с теми же настройками

Программа С# также отлично работает в других местах... мы получаем эту ошибку только на стороне клиента.

Буду признателен за любую помощь.

Спасибо

Редактировать:@Andomar, где найти корневые сертификаты в клиенте?Как это исправить?

@Alnitak, как мне запустить starttls с помощью библиотеки System.Net.Mail?

@David, что мне передать в качестве параметра для «(отправитель объекта, сертификат X509Certificate, цепочка X509Chain, SslPolicyErrors sslPolicyErrors)»

Спасибо Дэвид.Я добавил эти строки.Но я все еще не понимаю, что происходит, поскольку, насколько я понимаю, этот код не имеет прямой связи с System.Net.Mail. Надеюсь, проблема исчезнет.

Это было полезно?

Решение

Также убедитесь, что корневые сертификаты находятся в хранилище доверенных корневых центров клиента.Если это из службы, то добавление корневых сертификатов в хранилище локального компьютера также может помочь.Чтобы лучше понять причину, я нашел полезной следующую политику...

public bool ValidateServerCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// No errors so continue…
if (sslPolicyErrors == SslPolicyErrors.None)
       return true;

// I’m just logging it to a label on the page, 
//  this should be stored or logged to the event log at this time. 
lblStuff.Text += string.Format("Certificate error: {0} <BR/>", sslPolicyErrors);

// If the error is a Certificate Chain error then the problem is
// with the certificate chain so we need to investigate the chain 
// status for further info.  Further debug capturing could be done if
// required using the other attributes of the chain.
      if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors)
      {
       foreach (X509ChainStatus status in chain.ChainStatus)
       {
             lblStuff.Text += string.Format("Chain error: {0}: {1} <BR/>", status.Status, status.StatusInformation);
  }
}

// Do not allow this client to communicate 
//with unauthenticated servers.
      return false;
}

Чтобы добавить политику, используйте следующее: это нужно сделать только один раз для домена приложения.

using System.Net;
...
ServicePointManager.ServerCertificateValidationCallback =
new Security.RemoteCertificateValidationCallback(ValidateServerCertificate);

Вы также можете использовать политику, чтобы полностью удалить ошибку, но лучше исправить проблему, чем делать это.

Другие советы

Проверьте, находятся ли в хранилище клиента правильные корневые сертификаты.И системная дата клиента правильная.

Ты используешь STARTTLS или если предположить, что соединение через порт 587 с самого начала зашифровано SSL?

Серверы Google на smtp.gmail.com требуется STARTTLS.

Вы установили

 client.EnableSsl = true;

потому что это нужно Gmail

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top