Проблема с отправкой электронной почты с использованием C#
Вопрос
Когда я пытаюсь отправить электронную почту с помощью 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