Аутентификация или дешифрование не удалось при отправке почты в GMail с использованием SSL
Я имею в виду это руководство по электронной почте С# SMTP.
Вот мой код:
MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
mail.From = new MailAddress("[email protected]");
mail.To.Add("[email protected]");
mail.Subject = "Test Mail";
mail.Body = "This is for testing SMTP mail from GMAIL";
SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("MyUserNameInGmail", "MyGmailPassWord");
SmtpServer.EnableSsl = true;
SmtpServer.Send(mail);
К сожалению, есть исключение в отношении SSL, и я не могу его исправить:
Необработанное исключение: System.Net.Mail.SmtpException: Сообщение не может быть отправлен. --- > System.IO.IOException: аутентификация или дешифрование не смогли. --- > System.InvalidOperationException: SSL ошибка аутентификации: RemoteCertificateNotAvailable, RemoteCertificateChainErrors at System.Net.Mail.SmtpClient.m__4 (Отправитель System.Object, System.Security.Cryptography.X509Certificates.X509Certificate сертификат, System.Security.Cryptography.X509Certificates.X509Chain цепь, SslPolicyErrors sslPolicyErrors) [0x00000] в: 0 на System.Net.Security.SslStream + c__AnonStorey7 <. > M__A (System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Int32 [] certErrors) [0x00000] в: 0
в Mono.Security.Protocol.Tls.SslClientStream.OnRemoteCertificateValidation(System.Security.Cryptography.X509Certificates.X509Certificate сертификат, ошибки System.Int32 []) [0x00000] в: 0
в Mono.Security.Protocol.Tls.SslStreamBase.RaiseRemoteCertificateValidation(System.Security.Cryptography.X509Certificates.X509Certificate сертификат, ошибки System.Int32 []) [0x00000] в: 0
в Mono.Security.Protocol.Tls.SslClientStream.RaiseServerCertificateValidation(System.Security.Cryptography.X509Certificates.X509Certificate сертификат, System.Int32 [] certificateErrors) [0x00000] в: 0 на Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.validateCertificates(Mono.Security.X509.X509CertificateCollection сертификаты) [0x00000] в: 0 на Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsTls1 () [0x00000] в: 0
в Mono.Security.Protocol.Tls.Handshake.HandshakeMessage.Process() [0x00000] в: 0
at (обертка Remoting-Invoke-с проверкой) Mono.Security.Protocol.Tls.Handshake.HandshakeMessage: Процесс () в Mono.Security.Protocol.Tls.ClientRecordProtocol.ProcessHandshakeMessage(Mono.Security.Protocol.Tls.TlsStream handMsg) [0x00000] в: 0 на Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback(IAyncResult asyncResult) [0x00000] в: 0 --- Конец внутренняя трассировка стека исключений Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback(IAyncResult asyncResult) [0x00000] в: 0 --- Конец внутренняя трассировка стека исключений System.Net.Mail.SmtpClient.Send(Сообщение System.Net.Mail.MailMessage) [0x00000] в: 0
в csharpdungeon.MainClass.Main() [0x00000] в: 0
Ответы
Ответ 1
Правильное решение - не удалять подтверждение SSL-сертификата. GMail имеет действительный сертификат. Проблема в том, что Mono, похоже, не может найти сертификат.
Это совершенно неправильно по многим причинам, но главным образом потому, что он удаляет очень важную проверку сертификата:
ServicePointManager.ServerCertificateValidationCallback =
delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{ return true; };
Правильное решение - установить сертификат на вашем компьютере:
mozroots --import --ask-remove --machine
certmgr -ssl smtps://smtp.gmail.com:465
Это эффективно загрузит сертификат для gmail, и это сделает его доступным для моно.
Ответ 2
Проверьте, работает ли код ниже для вас; Я протестировал его в своей учетной записи gmail и, похоже, отлично работает с моим моно 2.0, работающим на ubuntu 10.04LTS
using System;
using System.Net;
using System.Net.Mail;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
namespace mono_gmail
{
class MainClass
{
public static void Main (string[] args)
{
MailMessage mail = new MailMessage();
mail.From = new MailAddress("[email protected]");
mail.To.Add("[email protected]");
mail.Subject = "Test Mail";
mail.Body = "This is for testing SMTP mail from GMAIL";
SmtpClient smtpServer = new SmtpClient("smtp.gmail.com");
smtpServer.Port = 587;
smtpServer.Credentials = new System.Net.NetworkCredential("my.name", "my.password");
smtpServer.EnableSsl = true;
ServicePointManager.ServerCertificateValidationCallback =
delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{ return true; };
smtpServer.Send(mail);
}
}
}
Решение взято из здесь
надеюсь, что это поможет, считает
Ответ 3
У вас нет соответствующих центров сертификации, установленных где-то, где Mono может их видеть. Пожалуйста, просмотрите FAQ по часто задаваемым вопросам безопасности Mono для шагов по исправлению этой ошибки.
Ответ 4
Если вы используете SSL, а не TLS, вам нужен порт 465, а не 587.
См. http://mail.google.com/support/bin/answer.py?hl=en&answer=13287.
Ответ 5
Вы пытались изменить порт, я знаю, что SMTP-порт по умолчанию для SSL равен 465
Ответ 6
Найдите другое решение из SmtpClient с Gmail
certmgr -ssl smtps://smtp.gmail.com:465
Если вы используете моно-веб-сервер, запустите команду с тем же именем пользователя, что и моно-процесс.
Ответ 7
Вам нужно безопасно отправлять SSL? Вы можете удалить этот оператор SmtpServer.EnableSsl = true;
, который не требует сертификата SSL.