SmtpClient avec Gmail
Je suis le développement d'un client de messagerie pour un projet d'école. J'ai réussi à envoyer des e-mails à l'aide de la SmtpClient
en C#. Cela fonctionne parfaitement avec n'importe quel serveur, mais il ne fonctionne pas avec Gmail. Je crois que c'est à cause de Google à l'aide de TLS. J'ai essayé de réglage EnableSsl
à true
sur le SmtpClient
mais ce n'est pas faire une différence.
C'est le code que j'utilise créer le SmtpClient
et envoyer un e-mail.
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'est l'erreur que j'obtiens quand j'essaie d'envoyer un e-mail.
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.<callback>m__4 (System.Object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, SslPolicyErrors sslPolicyErrors) [0x00000] in <filename unknown>:0
at System.Net.Security.SslStream+<BeginAuthenticateAsClient>c__AnonStorey7.<>m__A (System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Int32[] certErrors) [0x00000] in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslClientStream.OnRemoteCertificateValidation (System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Int32[] errors) [0x00000] in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslStreamBase.RaiseRemoteCertificateValidation (System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Int32[] errors) [0x00000] in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslClientStream.RaiseServerCertificateValidation (System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Int32[] certificateErrors) [0x00000] in <filename unknown>:0
at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.validateCertificates (Mono.Security.X509.X509CertificateCollection certificates) [0x00000] in <filename unknown>:0
at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsTls1 () [0x00000] in <filename unknown>:0
at Mono.Security.Protocol.Tls.Handshake.HandshakeMessage.Process () [0x00000] in <filename unknown>: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 <filename unknown>:0
at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at System.Net.Mail.SmtpClient.Send (System.Net.Mail.MailMessage message) [0x00000] in <filename unknown>:0
at P2Mailclient.SMTPClient.send (P2Mailclient.Email email) [0x00089] in /path/to/my/project/SMTPClient.cs:57
Quelqu'un a une idée de pourquoi j'ai peut-être cette erreur?
- essayez de définir
client.UseDefaultCredentials = false;
avant de définir les informations d'identification. - Qui n'a pas fait une différence.
- Ressemble au problème de certificat - voir ma réponse.
- J'ai édité ma réponse et suis en train d'écrire commentaire suivant de vous avoir informé. Veuillez voir le fichier de réponse.
- Je ne suis pas à mon ordinateur pour l'instant, mais je n'hésiterais pas à y jeter un oeil dès que possible. Je vous remercie pour votre aide.
Vous devez vous connecter pour publier un commentaire.
L'essayer:
dans votre système (juste en bash ou de Mono Invite de Commande si il est sur Windows). Et puis exécutez à nouveau le code.
EDIT:
J'ai oublié de vous doit également exécuter
(et répondez oui sur des questions). Cela fonctionne pour moi sur Mono 2.10.8, Linux (votre exemple).
Gmail serveur SMTP nécessite une authentification de votre demande valide gmail e-mail/mot de passe. Vous avez besoin d'activer le protocole SSL ainsi. Sans être réellement en mesure de voir un dump de toutes vos variables transmis dans les meilleurs suppose que je peux faire, c'est que vos informations ne sont pas valides, assurez-vous que vous utilisez un valide GMAIL e-mail/mot de passe.
Vous voudrez peut-être lire ici pour un exemple.
EDIT: Bon, voici quelque chose que j'ai écrit et testé et il a bien fonctionné pour moi:
Si vous avez besoin de plus d'info il y a un semblable, SI bien que l'article ici
[email protected]
.Je pense, vous devez valider le certificat du serveur qui est utilisé pour établir les connexions SSL.....
Utilisez le code suivant pour envoyer un mail lors de la validation de certificat de serveur.....
Importation
System.Security.Cryptography.X509Certificates
espace de noms à utiliserServicePointManager
Ce code fonctionne très bien pour moi, essayez de coller cette LinqPad, modifier les adresses de courrier électronique et un mot de passe et dites-nous ce que vous voyez:
Vous devez activer 2-l'Étape de Vérification de votre compte gmail et de créer un mot de passe d'application (https://support.google.com/accounts/answer/185833?hl=en). Une fois que vous remplacez votre mot de passe, le nouveau mot de passe d'application, il devrait fonctionner.
J'ai commencé à faire cela avec GMail en Mai 2013 après avoir travaillé pendant 6 momths. Le Mono du projet À L'Aide De Racines De Confiance Respectueusement document fourni des indications sur les contourner. J'ai choisi l'option n ° 1:
C'est trop gênant d'avoir l'e-mail pour mon arrêt de travail sans préavis.
Mise à jour le 26 Août 2016: l'utilisateur Chico a suggéré à la suite de la mise en oeuvre complète de la ServerCertificateValidationCallback de rappel. Je n'ai pas testé.