SmtpClient с Gmail
Я разрабатываю почтовый клиент для школьного проекта. Мне удалось отправить электронные письма с помощью SmtpClient
в C #. Это отлично работает с любым сервером, но не работает с Gmail. Я считаю, что это из-за того, что Google использует TLS. Я попытался установить EnableSsl
в true
на SmtpClient
но это не имеет никакого значения.
Это код, который я использую для создания SmtpClient
и отправки электронной почты.
this.client = new SmtpClient("smtp.gmail.com", 587); this.client.EnableSsl = true; this.client.UseDefaultCredentials = false; this.client.Credentials = new NetworkCredential("username", "password"); try { // Create instance of message MailMessage message = new MailMessage(); // Add receiver message.To.Add("[email protected]"); // Set sender // In this case the same as the username message.From = new MailAddress("[email protected]"); // Set subject message.Subject = "Test"; // Set body of message message.Body = "En test besked"; // Send the message this.client.Send(message); // Clean up message = null; } catch (Exception e) { Console.WriteLine("Could not send e-mail. Exception caught: " + e); }
Это ошибка, которую я получаю, когда пытаюсь отправить электронное письмо.
- Как отправить электронное письмо с помощью C # через Gmail
- Как проверить учетные данные smtp перед отправкой почты?
- Отправить HTML-письмо через C # с помощью SmtpClient
- c # Класс SmtpClient, не способный отправлять электронную почту с помощью gmail
- отправка почты с сетевыми учетными данными как истина в форме Windows не работает
Could not send e-mail. Exception caught: System.Net.Mail.SmtpException: Message could not be sent. ---> System.IO.IOException: The authentication or decryption has failed. ---> System.InvalidOperationException: SSL authentication error: RemoteCertificateNotAvailable, RemoteCertificateChainErrors at System.Net.Mail.SmtpClient.m__4 (System.Object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, SslPolicyErrors sslPolicyErrors) [0x00000] in :0 at System.Net.Security.SslStream+c__AnonStorey7.m__A (System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Int32[] certErrors) [0x00000] in :0 at Mono.Security.Protocol.Tls.SslClientStream.OnRemoteCertificateValidation (System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Int32[] errors) [0x00000] in :0 at Mono.Security.Protocol.Tls.SslStreamBase.RaiseRemoteCertificateValidation (System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Int32[] errors) [0x00000] in :0 at Mono.Security.Protocol.Tls.SslClientStream.RaiseServerCertificateValidation (System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Int32[] certificateErrors) [0x00000] in :0 at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.validateCertificates (Mono.Security.X509.X509CertificateCollection certificates) [0x00000] in :0 at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsTls1 () [0x00000] in :0 at Mono.Security.Protocol.Tls.Handshake.HandshakeMessage.Process () [0x00000] in :0 at (wrapper remoting-invoke-with-check) Mono.Security.Protocol.Tls.Handshake.HandshakeMessage:Process () at Mono.Security.Protocol.Tls.ClientRecordProtocol.ProcessHandshakeMessage (Mono.Security.Protocol.Tls.TlsStream handMsg) [0x00000] in :0 at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IAsyncResult asyncResult) [0x00000] in :0 --- End of inner exception stack trace --- at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) [0x00000] in :0 --- End of inner exception stack trace --- at System.Net.Mail.SmtpClient.Send (System.Net.Mail.MailMessage message) [0x00000] in :0 at P2Mailclient.SMTPClient.send (P2Mailclient.Email email) [0x00089] in /path/to/my/project/SMTPClient.cs:57
У кого-нибудь есть идея, почему я могу получить эту ошибку?
- Как установить имя пользователя и пароль для объекта SmtpClient в .NET?
- System.Net.Mail создает недействительные электронные письма и файлы eml? Вставка дополнительных точек в имена хостов
- Могу ли я тестировать SmtpClient перед вызовом client.Send ()?
- Каковы наилучшие методы использования SmtpClient, SendAsync и Dispose в .NET 4.0
- C # отправка писем со встроенными изображениями с использованием SmtpClient
- Отправляйте e-mail через SMTP с помощью C #
- Как отправить электронную почту с помощью простых команд SMTP через Gmail?
- Не удается выполнить авторизацию в Gmail smtp через MailMessage & smtpClient
Попробуйте запустить это:
mozroots --import --ask-remove
в вашей системе (только в bash или из командной строки Mono, если она находится в Windows). А затем запустите код еще раз.
РЕДАКТИРОВАТЬ:
Я забыл, что вы также должны бежать
certmgr -ssl smtps://smtp.gmail.com:465
(и ответьте «да» на вопросы). Это работает для меня на Mono 2.10.8, Linux (с вашим примером).
Для SMTP-сервера Gmail требуется аутентификация вашего запроса с помощью действительной комбинации электронной почты / пароля gmail. Вам также нужен SSL. Не имея возможности увидеть, как дамп всех ваших переменных передается наилучшим образом, я могу сделать, что ваши учетные данные недействительны, убедитесь, что вы используете действительную комбинацию электронной почты / пароля GMAIL .
Вы можете прочитать здесь рабочий пример.
EDIT: Хорошо, вот что я написал и протестировал именно тогда, и это сработало хорошо для меня:
public static bool SendGmail(string subject, string content, string[] recipients, string from) { if (recipients == null || recipients.Length == 0) throw new ArgumentException("recipients"); var gmailClient = new System.Net.Mail.SmtpClient { Host = "smtp.gmail.com", Port = 587, EnableSsl = true, UseDefaultCredentials = false, Credentials = new System.Net.NetworkCredential("******", "*****") }; using (var msg = new System.Net.Mail.MailMessage(from, recipients[0], subject, content)) { for (int i = 1; i < recipients.Length; i++) msg.To.Add(recipients[i]); try { gmailClient.Send(msg); return true; } catch (Exception) { // TODO: Handle the exception return false; } } }
Если вам нужна дополнительная информация, здесь есть аналогичная статья SO
Я думаю, вам нужно проверить сертификат сервера, который используется для установления SSL-подключений …..
Используйте следующий код для отправки почты с подтверждением сертификата сервера …..
this.client = new SmtpClient(_account.SmtpHost, _account.SmtpPort); this.client.EnableSsl = _account.SmtpUseSSL; this.client.Credentials = new NetworkCredential(_account.Username, _account.Password); try { // Create instance of message MailMessage message = new MailMessage(); // Add receivers for (int i = 0; i < email.Receivers.Count; i++) message.To.Add(email.Receivers[i]); // Set sender message.From = new MailAddress(email.Sender); // Set subject message.Subject = email.Subject; // Send e-mail in HTML message.IsBodyHtml = email.IsBodyHtml; // Set body of message message.Body = email.Message; //validate the certificate ServicePointManager.ServerCertificateValidationCallback = delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; }; // Send the message this.client.Send(message); // Clean up message = null; } catch (Exception e) { Console.WriteLine("Could not send e-mail. Exception caught: " + e); }
Import System.Security.Cryptography.X509Certificates
namespace для использования ServicePointManager
Этот код отлично подходит для меня, попробуйте вставить его в LinqPad, отредактируйте почтовые адреса и пароль и сообщите нам, что вы видите:
var client = new System.Net.Mail.SmtpClient("smtp.gmail.com", 587); client.EnableSsl = true; client.UseDefaultCredentials = false; client.Credentials = new System.Net.NetworkCredential("[email protected]", "xxxxxxx"); try { // Create instance of message System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(); // Add receiver message.To.Add("[email protected]"); // Set sender // In this case the same as the username message.From = new System.Net.Mail.MailAddress("[email protected]"); // Set subject message.Subject = "Test"; // Set body of message message.Body = "En test besked"; // Send the message client.Send(message); // Clean up message = null; } catch (Exception e) { Console.WriteLine("Could not send e-mail. Exception caught: " + e); }
Вам необходимо включить двухэтапную аутентификацию в своей учетной записи gmail и создать пароль для приложения ( https://support.google.com/accounts/answer/185833?hl=ru ). После замены пароля новым паролем приложения он должен работать.
Credentials = new System.Net.NetworkCredential("your email address", "your app password");
Я начал получать это с GMail в мае 2013 года после работы в течение 6 месяцев. Проект Mono с использованием надежных корней Уважительно документ предоставил руководство по работе. Я выбрал вариант №1:
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
Это слишком разрушительно, когда электронная почта для моей службы перестает работать без предупреждения.
Обновление 26 августа 2016 года: пользователь Chico предложил следующую полную реализацию обратного вызова ServerCertificateValidationCallback. Я не тестировал.
ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback; bool MyRemoteCertificateValidationCallback(System.Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { bool isOk = true; // If there are errors in the certificate chain, look at each error to determine the cause. if (sslPolicyErrors != SslPolicyErrors.None) { for (int i=0; i