Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SmtpClient with Gmail

I'm developing a mail client for a school project. I have managed to send e-mails using the SmtpClient in C#. This works perfectly with any server but it doesn't work with Gmail. I believe it's because of Google using TLS. I have tried setting EnableSsl to true on the SmtpClient but this doesn't make a difference.

This is the code I am using to create the SmtpClient and send an 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); } 

This is the error I am getting when I try to send an 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  

Does anyone have an idea why I might be getting this error?

like image 370
simonbs Avatar asked Mar 21 '12 08:03

simonbs


People also ask

Can I use Gmail on Mailspring?

Run Mailspring and choose IMAP / SMTP on the email setup screen. Enter the connection settings for your Gmail account and click "Continue". Mailspring is a full email client and allows you to check your Gmail email without using the webmail interface. Your email should be displayed in a few minutes.

Can I use Gmail for SMTP relay?

If your organization uses Microsoft Exchange or another SMTP service or server, you can set up the SMTP relay service to route outgoing mail through Google. You can use it to: Filter messages for spam and viruses before they reach external recipients. Apply email security and advanced Gmail settings to outgoing ...

What is SMTP client for Gmail?

The SMTP server for Gmail is a free SMTP server that anyone across the globe can use. It allows you to manage email transactions from your Gmail account via email clients or web applications. Email clients are user-end mail applications. Some of the most popular ones are Thunderbird, Outlook, and Mac Mail.


1 Answers

Gmail's SMTP server requires you to authenticate your request with a valid gmail email/password combination. You do need SSL enabled as well. Without actually being able to see a dump of all your variables being passed in the best guess I can make is that your Credentials are invalid, make sure you're using a valid GMAIL email/password combination.

You might want to read here for a working example.

EDIT: Okay here's something I wrote and tested just then and it worked fine for me:

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;         }     } } 

If you need any more info there's a similar SO article here

like image 139
Jason Larke Avatar answered Sep 20 '22 21:09

Jason Larke