20

I cannot figure out for the life of my why this isn't working

SmtpClient smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    UseDefaultCredentials = false,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    Credentials = new NetworkCredential("myemail@gmail.com", "myGmailPasswordHere"),
    EnableSsl = true,
    Timeout = 10000
};


smtp.Send(mail);

I get:

The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required.

I just specified EnableSsl to true so that shouldn't be the issue in terms of secure connection.

I'm running this from localhost. And yes, my username and password I'm entering to auth (my gmail account credentials) is 100% right.

abatishchev
  • 98,240
  • 88
  • 296
  • 433
PositiveGuy
  • 46,620
  • 110
  • 305
  • 471

11 Answers11

41

I know this is an old topic, BUT... Google has changed something on their security settings.

Was struggling with all the answers until I checked my email with a mail from Google stating that "we've recently blocked a sign-in attempt on your Google account".

That led me to this page: Google Account Security

Under the "Access for less secure apps" section, you can enable access to your account from other devices/applications... like your C# application.

Note, there is no longer an "application specific" section.

Hope this helps someone... I just lost 30 minutes of my life...

Tiny
  • 573
  • 5
  • 9
  • this answer should get more votes.. sometimes we should try less voted answers too.. I tried all articles and really gave up after I tried solution marked as answer in http://stackoverflow.com/questions/32260/sending-email-in-net-through-gmail I mean I had no idea what am doing wrong.. Thanks Tiny.. your solution worked for me.. – Silver Apr 21 '15 at 13:14
  • This really helped me. I don't understand why this information isn't easier to find. – Fishcake Jun 01 '15 at 07:21
  • 1
    So what do I need to change in my code if I don't want to allow "less secure apps" in my gmail account? –  Jan 14 '16 at 13:02
  • 1
    if you use your own domain, you need to use https://admin.google.com/ to set *2-step-verification* or allowing *less secure apps* – itsho Feb 10 '16 at 09:48
  • I turned on allowing less secure app access and still having intermittent issues. I don't follow what this reply is suggesting to do exactly. – emirhosseini Aug 30 '19 at 21:21
23

If login info is 100% right, you need to set UseDefaultCredentials = false first and then set the credentials you want to use Credentials = new NetworkCredential("myemail@gmail.com", "myGmailPasswordHere").

If you set the credentials first, when you set UseDefaultCredentials = false this will make the Credentials property to null.

This is wired, but it happened to me.

Debug your code and check if the Credentials property is null before you call smtp.Send(message);. If so, then try inverting the order. It seems you have it in the right order, but if it's null, don't use the inline initialization.

Hope it helps.

EDIT: If you are using two-step verification, be sure you are using an App Specific password

edteke
  • 562
  • 5
  • 22
  • Indeed this really works. Had same problem and this fixed mine out. – radu florescu Jan 06 '14 at 12:18
  • 1
    I spent 3 hours on this today... can't believe this fixed it. – MrZander Sep 26 '14 at 06:52
  • OMG... spent half of the day trying nearly everything. THANKS for the answer! – okieh Mar 18 '15 at 16:33
  • this did not work for me but i did consider it.. plz try http://stackoverflow.com/a/25414099/2649883 if still facing problem – Silver Apr 21 '15 at 13:31
  • incredible but in this order is work correctly SmtpClient smtpClient = new SmtpClient(); **smtpClient.UseDefaultCredentials = false;** smtpClient.Credentials = new NetworkCredential(senderAddress,senderPassword); smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.Host = host; smtpClient.Port = port; smtpClient.EnableSsl = useSsl; return smtpClient; – inkubpl Apr 29 '19 at 07:51
11

It looks like Gmail requires Application-specific password(not your main password).

Please, look into this: http://support.google.com/mail/bin/answer.py?hl=en&answer=1173270

I had the same problem recently.

Aleh Zasypkin
  • 731
  • 6
  • 8
  • 3
    Much thx, that did the trick for me. Using the code base from [here](http://stackoverflow.com/a/489594/271992), following [this advice](http://stackoverflow.com/a/11513412/271992) along with my application generated [2-step verification](http://www.google.com/2step) Google password (*not* my regular Gmail password), I was able to send email from a C# test client. I was doing development/testing on my local desktop using my personal Gmail account and forgot I had enabled Gmail's [2-step verification](http://www.google.com/2step)...so that is 2 hours of my life I'll never get back! :) – Al Dass Mar 28 '13 at 13:54
  • http://stackoverflow.com/a/25414099/2649883 works fine. there is no application specific section in gmail anymore – Silver Apr 21 '15 at 13:32
3

I had this problem before and fixed it by following these steps:

  1. Go to "My Account" settings.
  2. Click "Sign-in & Security" category.
  3. Scroll down to "Connected apps & sites" section.
  4. turn off the "Allow less secure apps" option.

I just turned this option off and my code ran successfully.

Abdulhameed
  • 322
  • 3
  • 13
3

This worked just fine for me

SmtpClient smtp = new SmtpClient
    {
        Host = "smtp.gmail.com",
        Port = 587,
        UseDefaultCredentials = false,
        DeliveryMethod = SmtpDeliveryMethod.Network,
        Credentials = new NetworkCredential("myid@gmail.com", "mypassword"),
        EnableSsl = true,
        Timeout = 10000
    };

    MailMessage message = new MailMessage();
    message.Body = "hello there";
    message.Subject = "hi!!";
    message.To.Add("myid@gmail.com");
    message.From = new MailAddress("myid@gmail.com");
    smtp.Send(message);
krishna
  • 1,366
  • 2
  • 15
  • 23
1

For me the solution required 2 "steps":

  • set UseDefaultCredentials = false first, then set the credentials I want to use Credentials = new NetworkCredential("myemail@gmail.com", "myGmailPasswordHere"). Setting the credentials first, when I set UseDefaultCredentials = false will make the Credentials property null.
  • Allow less secure apps on my Google profile.
mickmackusa
  • 43,625
  • 12
  • 83
  • 136
0

Had the same issue accessing smtp.gmail.com from an ASP.NET application running on Amazon AWS hosting. It turned out that my configuration was right - it was also working fine from another computer - but gmail would deny my login attempt, because I try logging in from an unusual location. I logged on to gmail over the web interface (www.gmail.com), and had to answer a captcha. After that it worked.

oliver
  • 221
  • 3
  • 7
0

My problem was that the domain-owner for our gmail-account had disabled both "Access for less secure apps" and two step authentication. There was no way to enable it, I couldn't even see the setting. So I tested with my personal account instead, and it worked fine.

Robert
  • 2,357
  • 4
  • 25
  • 46
0

Very simple just follow this for C# WPF Application:

       private void SendByGmail(string subject, string body, string recepientEmail, string MailMsgFrom, string MailMsgPass)
        {
            using (MailMessage mailMessage = new MailMessage())
            {
                mailMessage.From = new MailAddress(MailMsgFrom);
                mailMessage.Subject = subject;
                mailMessage.Body = body;
                mailMessage.IsBodyHtml = true;
                mailMessage.To.Add(new MailAddress(recepientEmail));
                mailMessage.Priority = System.Net.Mail.MailPriority.High;
                SmtpClient smtp = new SmtpClient();
                smtp.Host = "smtp.gmail.com";
                smtp.EnableSsl = true;
                smtp.Timeout = 200000;
                System.Net.NetworkCredential NetworkCred = new System.Net.NetworkCredential();
                NetworkCred.UserName = MailMsgFrom;
                NetworkCred.Password = MailMsgPass;
                smtp.UseDefaultCredentials = true;
                smtp.Credentials = NetworkCred;
                smtp.Port = 587;
                smtp.Send(mailMessage);

            }
        }

After that you should get like this Error

smtpException   {"The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required. Learn more at"}   System.Net.Mail.SmtpException

To Solve this problem, at first login your email account to your google account in web browser. Then just follow this link Google Account Activity. Then you'll get recent Devices & activity by your account. If show block your current activity from your current device. Just Unblock this. Then try again to send email.
Thanks

Rajib Chy
  • 800
  • 10
  • 22
0
<mailSettings>
            <smtp from="youremail@gmail.com">
                <network host="smtp.gmail.com" password="yourpassword" port="587" userName="username"/>
            </smtp>
</mailSettings>

Edit: try adding this line smtp.Credentials = Credentials after this

Credentials = new NetworkCredential("myemail@gmail.com", "myGmailPasswordHere"),

coder
  • 13,002
  • 31
  • 112
  • 214
  • yea I know you can do this but this doesn't explain why the hard coded magic strings of mine above (only for testing) isn't working. – PositiveGuy Feb 01 '12 at 23:15
  • why? I already set that in the object initializer for smtpClient Credentials = new NetworkCredential("myemail@gmail.com", "myGmailPasswordHere") – PositiveGuy Feb 01 '12 at 23:26
0

Have a callback as follows. Tell System.Net to ignore the error!

Add this before call to Send()

ServicePointManager.ServerCertificateValidationCallback = 
    delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
    { return true; };

smtp.Send(mail);
ukhardy
  • 2,084
  • 1
  • 13
  • 12