c# SmtpClient class not able to send email using gmail
Solution 1
You won't believe what fixed my problem.
The Credentials property
ss.Credentials = new NetworkCredential("username", "pass");
must be declared after
ss.UseDefaultCredentials = false;
So the final working code listing is
SmtpClient ss = new SmtpClient("smtp.gmail.com", 587);
ss.EnableSsl = true;
ss.Timeout = 10000;
ss.DeliveryMethod = SmtpDeliveryMethod.Network;
ss.UseDefaultCredentials = false;
ss.Credentials = new NetworkCredential("username", "pass");
MailMessage mm = new MailMessage("[email protected]", "[email protected]", "subject here", "my body");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
ss.Send(mm);
Is this a bug?
Solution 2
In your case it means you have to send it with the email address you logged into Google with.
So maybe there's a firewall that interferes with the connection. I'm encountering this problem right now while testing your code. Try the suggested TELNET-Test.
Solution 3
Work for me only with port 25.
Solution 4
This works, but it's not very performance friendly. Check out client.SendAsync: http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx
An example use case:
var message = new MailMessage("from", "to", "subject", "body");
var client = new SmtpClient("smtp.gmail.com", 587)
{
Credentials = new NetworkCredential("login", "password"),
EnableSsl = true
};
client.SendCompleted += (s, e) =>
{
client.Dispose();
message.Dispose();
};
client.SendAsync(message, null);
Solution 5
This work's perfectly.
Create a mail Template in a separate file MailTemplate.html
.
Add genuine NetworkCredentials - login and Password
private void SendMail()
{
string filename = Server.MapPath("~/MailTemplate.html");
string username = UserName.Text.ToString();
string mailbody = System.IO.File.ReadAllText(filename);
mailbody = mailbody.Replace("##NAME##", username);
string to = Email.Text;
string from = "[email protected]";
MailMessage message = new MailMessage(from, to);
message.Subject = "Auto Response Email";
message.Body = mailbody;
message.BodyEncoding = Encoding.UTF8;
message.IsBodyHtml = true;
SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
System.Net.NetworkCredential basicCredential = new System.Net.NetworkCredential("[email protected]", "test123#");
client.EnableSsl = true;
client.UseDefaultCredentials = true;
client.Credentials = basicCredential;
try
{
client.Send(message);
SuccessMessage.Text = "Email Sending successfully";
}
catch (Exception ex)
{
ErrorMessage.Text = ex.Message.ToString();
}
}
MailTemplate.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Title</title>
</head>
<body>
<div style="border: thin solid #0066FF; width: 550px; margin: 25px auto; padding: 15px; font-family: 'Microsoft Himalaya'; font-size: x-large; font-style: normal; color: #0066FF; background-color: #EfEFF2;">
<br />
<p style="vertical-align: middle">Dear ##NAME##,</p>
</div>
</body>
</html>
Related videos on Youtube
Razor
The universe is mostly hydrogen and ignorance. #SOreadytohelp
Updated on January 14, 2020Comments
-
Razor over 4 years
I'm having trouble sending email using my gmail account. Im pulling my hair out.
The same settings work fine in Thunderbird.
Here's the code. I've also tried port 465 with no luck.
SmtpClient ss = new SmtpClient("smtp.gmail.com", 587); ss.Credentials = new NetworkCredential("username", "pass"); ss.EnableSsl = true; ss.Timeout = 10000; ss.DeliveryMethod = SmtpDeliveryMethod.Network; ss.UseDefaultCredentials = false; MailMessage mm = new MailMessage("[email protected]", "[email protected]", "subject here", "my body"); mm.BodyEncoding = UTF8Encoding.UTF8; mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure; ss.Send(mm);
Heres the error
"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 "
Heres the stack trace
at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response) at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, String from) at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException& exception) at System.Net.Mail.SmtpClient.Send(MailMessage message) at email_example.Program.Main(String[] args) in C:\Users\Vince\Documents\Visual Studio 2008\Projects\email example\email example\Program.cs:line 23 at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()
-
kenny almost 15 yearsI would say no, because when I changed to UseDefaultCredentials = true, I would want any existing credentials be be overwritten.
-
Bdiem almost 15 yearsYes but we're encountering the other way here. Overwritten Credentials if you set DefaultCredentials to false. That doesn't sound right.
-
Razor almost 15 yearsKenny, it seems a bit counter intuitive that you need to declare properties in the right order.
-
Jason Short almost 15 yearsYou can still get that error when exceeding sending limits, or if the machine in question has never had a real user logged on before through a browser. It is confusing Google returns that error, but they do.
-
Alexandre Leites about 14 yearsencountered same bug, UseDefaultCredentials must be set first before using Credentials property. a bit counter-intuitive, properties should not depend on order
-
Smith over 12 years@VincePanuccio I still cant send email even after doing all that you posted above, i get this
Server does not support secure connections.
and when i disable the secure connection, i get thisThe SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first. n58sm2181990een.10
. could you help me with some tips -
Razor over 12 yearsWhat version of .NET are you using? I understand some changes were made to the Smtp class in .NET 4. Try executing the code above under .NET 2 CLI and see how you go.
-
n99 over 12 years@VincePanuccio I examined what's going on using reflector. Setting ss.UseDefaultCredentials = false essentially is resetting Credentials to null. This is why you had troubles. But that also means ss.UseDefaultCredentials = false is not even necessary at all, it doesn't do anything in the end
-
Gaurang Jadia about 12 yearsIt was not working for me on 465 port. I just changed to 587and it worked. SmtpClient smtpClient = new SmtpClient("smpt.gmail.com", Convert.ToInt32(587));
-
Casey over 10 yearsWhy are you using Convert.ToInt32 on an int?
-
Joshua Pech over 9 yearsR#@U#*FH#$*Ih WHY WOULD MICROSOFT DO THIS?! I can't believe that actually worked...
-
Omar Mneimneh about 4 yearsI can't believe how many hours I wasted on this, thanks for the answer!