Can we send mails from localhost using asp.net and c#? - c#

i am using using System.Net.Mail;
and following code to send mail
MailMessage message = new MailMessage();
SmtpClient client = new SmtpClient();
// Set the sender's address
message.From = new MailAddress("fromAddress");
// Allow multiple "To" addresses to be separated by a semi-colon
if (toAddress.Trim().Length > 0)
{
foreach (string addr in toAddress.Split(';'))
{
message.To.Add(new MailAddress(addr));
}
}
// Allow multiple "Cc" addresses to be separated by a semi-colon
if (ccAddress.Trim().Length > 0)
{
foreach (string addr in ccAddress.Split(';'))
{
message.CC.Add(new MailAddress(addr));
}
}
// Set the subject and message body text
message.Subject = subject;
message.Body = messageBody;
// Set the SMTP server to be used to send the message
client.Host = "YourMailServer";
// Send the e-mail message
client.Send(message);
for Host i am providing client.Host = "localhost";
for this its falling with error
No connection could be made because the target machine actively
refused it some_ip_address_here
and when i use client.Host = "smtp.gmail.com";
i get following error
A connection attempt failed because the connected party did not
properly respond after a period of time, or established connection
failed because connected host has failed to respond
i am not able to send mail through localhost.
Please help me out, i am new to c# please correct me in code where i am going wrong..?

Here is some code that works for sending mail via gmail (code from somewhere here on stackoverflow. It is similar to the code here: Gmail: How to send an email programmatically):
using (var client = new SmtpClient("smtp.gmail.com", 587)
{
Credentials = new NetworkCredential("yourmail#gmail.com", "yourpassword"),
EnableSsl = true
})
{
client.Send("frommail#gmail.com", "tomail#gmail.com", "subject", message);
}

For sending mail from client.Host = "localhost" you need set up local SMTP server.
For sending mail via Google (or via any other SMTP server, including your own local SMTP) you must set username, password, ssl settings - all as required by SMTP server chosen, and you need to read their help for this.
For example Google says that you need SSL, port 465 or 587, server smtp.gmail.com and your username and password.
You can assign all this values in .config file.
<system.net>
<mailSettings>
<smtp>
<network host="smtp.gmail.com" enableSsl="true" port="587" userName="yourname#gmail.com" password="password" />
</smtp>
</mailSettings>
</system.net>
Or set to SmtpClient in code before every use:
client.Host = "smtp.gmail.com";
client.Port = 587;
client.EnableSSL = true;
client.Credentials = new NetworkCredential("yourname#gmail.com", "password");

Place this code inside a <configuration> </configuration> in web.config file
<system.net>
<mailSettings>
<smtp>
<network host="smtp.gmail.com" enableSsl="true" port="587" userName="youremail#gmail.com" password="yourpassword" />
</smtp>
</mailSettings>
</system.net>
then backend code
MailMessage message = new MailMessage();
message.IsBodyHtml = true;
message.From = new MailAddress("email#gmail.com");
message.To.Add(new MailAddress(TextBoxEadd.Text));
message.CC.Add(new MailAddress("email#gmail.com"));
message.Subject = "New User Registration ! ";
message.Body = "HELLO";
sr.Close();
SmtpClient client = new SmtpClient();
client.Send(message);
I hope this code help you! :)

use this Line..Dont Use Port And HostName
LocalClient.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;

I just wanted to add that Gmail now requires App Password in order to use it from other applications. Check this link. I had to find it the hard way. After I created an App Password and then I changed the NetworkCredentials to use it to send emails.

Related

The SMTP server requires a secure connection or the client was not authenticated.While sending Email in c# [duplicate]

I want to send an email from my application and i have written following code for sending mail
MailMessage msg = new MailMessage();
msg.From = new MailAddress("mymailid");
msg.To.Add("receipientid");
msg.Subject = "test";
msg.Body = "Test Content";
msg.Priority = MailPriority.High;
SmtpClient client = new SmtpClient();
client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
client.Host = "smtp.gmail.com";
client.Port = 587;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.EnableSsl = true;
client.UseDefaultCredentials = true;
client.Send(msg);
I am running it on localhost so what mistake i am doing to send it.
When i send button it gives an error like
The SMTP server requires a secure connection or the client was not
authenticated. The server response was: 5.5.1 Authentication
Required.
Code in Web.config file
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="smtpServer" value="smtp.gmail.com" />
<add key="EnableSsl" value = "true"/>
<add key="smtpPort" value="587" />
<add key="smtpUser" value="sender#gmail.com" />
<add key="smtpPass" value="mypassword" />
<add key="adminEmail" value="sender#gmail.com" />
</appSettings>
<system.net>
<mailSettings>
<smtp from="sender#gmail.com">
<network host="smtp.gmail.com" password="mypassword" port="587" userName="sender#gmail.com" enableSsl="true"/>
</smtp>
</mailSettings>
</system.net>
what should i do to solve this error and send mail??
I have the same problem.
I have found this solution:
Google may block sign in attempts from some apps or devices that do not use modern security standards. Since these apps and devices are easier to break into, blocking them helps keep your account safer.
Some examples of apps that do not support the latest security standards include:
The Mail app on your iPhone or iPad with iOS 6 or below
The Mail app on your Windows phone preceding the 8.1 release
Some Desktop mail clients like Microsoft Outlook and Mozilla Thunderbird
Therefore, you have to enable Less Secure Sign-In (or Less secure app access) in your google account.
After sign into google account, go to:
https://www.google.com/settings/security/lesssecureapps
or
https://myaccount.google.com/lesssecureapps
In C#, you can use the following code:
using (MailMessage mail = new MailMessage())
{
mail.From = new MailAddress("email#gmail.com");
mail.To.Add("somebody#domain.com");
mail.Subject = "Hello World";
mail.Body = "<h1>Hello</h1>";
mail.IsBodyHtml = true;
mail.Attachments.Add(new Attachment("C:\\file.zip"));
using (SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587))
{
smtp.Credentials = new NetworkCredential("email#gmail.com", "password");
smtp.EnableSsl = true;
smtp.Send(mail);
}
}
First check for gmail's security related issues. You may have enabled double authentication in gmail. Also check your gmail inbox if you are getting any security alerts. In such cases check other answer of #mjb as below
Below is the very general thing that i always check first for such issues
client.UseDefaultCredentials = true;
set it to false.
Note #Joe King's answer - you must set client.UseDefaultCredentials before you set client.Credentials
Ensure you set SmtpClient.Credentials after calling SmtpClient.UseDefaultCredentials = false.
The order is important as setting SmtpClient.UseDefaultCredentials = false will reset SmtpClient.Credentials to null.
I've searched and tried different things for hours.. To summarize, I had to take into consideration the following points:
Use smtp.gmail.com instead of smtp.google.com
Use port 587
Set client.UseDefaultCredentials = false; before setting credentials
Turn on the Access for less secure apps
Set client.EnableSsl = true;
If these steps didn't help, check this answer.
Perhaps, you can find something useful on this System.Net.Mail FAQ too.
App Passwords helped me.
Go to https://myaccount.google.com/security.
Scroll down to "Signing in to Google".
Enable 2-Step Verification.
Add App Password.
Use the generated password in your code.
Try to login in your gmail account. it gets locked if you send emails by using gmail SMTP. I don't know the limit of emails you can send before it gets locked but if you login one time then it works again from code.
make sure your webconfig setting are good.
Try it this way, I just made some light changes:
MailMessage msg = new MailMessage();
msg.From = new MailAddress("mymailid#gmail.com");
msg.To.Add("receipientid#gmail.com");
msg.Subject = "test";
msg.Body = "Test Content";
//msg.Priority = MailPriority.High;
using (SmtpClient client = new SmtpClient())
{
client.EnableSsl = true;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("mymailid#gmail.com", "mypassword");
client.Host = "smtp.gmail.com";
client.Port = 587;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(msg);
}
Also please show your app.config file, if you have mail settings there.
As of May 30, 2022 less secure apps are no longer supported from Google so you have to use App Passwords.
https://support.google.com/accounts/answer/6010255?authuser=1&hl=en-GB&authuser=1&visit_id=637957424028050444-425688120&p=less-secure-apps&rd=1
Here are the steps to set up an app password via google:
https://support.google.com/accounts/answer/185833?authuser=1
Then you need to use the 16 character app password for the smtpClient's credentials:
smtpClient = new SmtpClient(emailHost)
{
Port = port,
DeliveryMethod = SmtpDeliveryMethod.Network,
Credentials = new NetworkCredential(fromEmail, emailPassword),
EnableSsl = true,
};
The emailpassword should be the 16 character generated App Password.
Port: 587
Emailhost: smtp.gmail.com
Then the rest of the code:
var mailMessage = new MailMessage{
From = new MailAddress(fromEmail),
Subject = "Yoursubject",
Body = $"Your body",
IsBodyHtml = true,
};
mailMessage.To.Add(newEmail);
if (smtpClient != null)
smtpClient.Send(mailMessage);
Turn on less secure app from this link and boom...
try to enable allow less secure app access.
Here, you can enable less secure app after login with your Gmail.
https://myaccount.google.com/lesssecureapps
Thanks.
For security reasons, Google has discontinued turning on Access for Less Secure Apps, effective from May 30, 2021. Hence, some of the answers here that emphasized enabling access for less secure apps have become obsolete.
Here is an answer I found on VB Forum and it worked for me. I was able to send a mail successfully.
"Please do following steps.
In Google Account Activate 2-step verification.
Select App Password in Google Account => Security => Signing to Google.
In Select App Combo Select Other and Name as Windows App & Click Generate it.
Copy Password and use it in place of email password.
It will work."
Check out the link to see more answers.
https://www.vbforums.com/showthread.php?895413-Sending-Email-via-Gmail-changing-for-May-30
Scroll down and see the answer posted by microbrain
See the code with which I sent my mail below:
Dim emailTo As String = TxtEmail.Text.Trim()
If emailTo.Length > 10 Then
Try
Dim Smtp_Server As New SmtpClient
Dim e_mail As New MailMessage()
Smtp_Server.UseDefaultCredentials = False
Smtp_Server.Credentials = New Net.NetworkCredential("myemail#gmail.com", "***16-digit-code***")
Smtp_Server.Port = 587
Smtp_Server.EnableSsl = True
Smtp_Server.Host = "smtp.gmail.com"
e_mail = New MailMessage()
e_mail.From = New MailAddress("myemailaddress#gmail.com")
e_mail.To.Add(emailTo)
e_mail.Subject = "Login OTP"
e_mail.IsBodyHtml = False
e_mail.Body = "some text here"
Smtp_Server.Send(e_mail)
MessageBox.Show("Your login OTP has been sent to " & emailTo)
LblOTPSuccess.Visible = True
TxtOTP.Visible = True
BtnVerifyOTP.Visible = True
TxtOTP.Focus()
Catch error_t As Exception
MessageBox.Show(error_t.ToString, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Else
MessageBox.Show("Email address is invalid or too short", "Invalid Email", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Remember to change the parameters in the code to suit you.
I encountered the same problem even I set "UseDefaultCredentials" to false. Later I found that the root cause is that I turned on "2-step Verification" in my account. After I turned it off, the problem is gone.
Make sure that Access less secure app is allowed.
MailMessage mail = new MailMessage();
mail.From = new MailAddress("xx#gmail.com");
mail.Sender = new MailAddress("xx#gmail.com");
mail.To.Add("external#emailaddress");
mail.IsBodyHtml = true;
mail.Subject = "Email Sent";
mail.Body = "Body content from";
SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
smtp.UseDefaultCredentials = false;
smtp.Credentials = new System.Net.NetworkCredential("xx#gmail.com", "xx");
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.EnableSsl = true;
smtp.Timeout = 30000;
try
{
smtp.Send(mail);
}
catch (SmtpException e)
{
textBox1.Text= e.Message;
}
In my case, I was facing the same issue. After a long research, don't set UseDefaultCredentials value to false. Because default value of UseDefaultCredentials is false.
Another key point is to set network credential just before the client.send(message) statement.
Wrong Code:
SmtpClient client = new SmtpClient();
client.Host = ServerName;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = false;
client.Send(message);
Wrong Code:
SmtpClient client = new SmtpClient();
client.Host = ServerName;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = true;
client.Send(message);
Correct code
SmtpClient client = new SmtpClient();
client.Host = ServerName;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
// client.UseDefaultCredentials = true;
client.Send(message);
Correct code
SmtpClient client = new SmtpClient();
client.Host = ServerName;
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = false;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Send(message);
Now its working ok with both corrected codes. So in this case sequence matters.
Cheers!
Below is my code.I also had the same error but the problem was that i gave my password wrong.The below code will work perfectly..try it
MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
mail.From = new MailAddress("fromaddress#gmail.com");
mail.To.Add("toaddress1#gmail.com");
mail.To.Add("toaddress2#gmail.com");
mail.Subject = "Password Recovery ";
mail.Body += " <html>";
mail.Body += "<body>";
mail.Body += "<table>";
mail.Body += "<tr>";
mail.Body += "<td>User Name : </td><td> HAi </td>";
mail.Body += "</tr>";
mail.Body += "<tr>";
mail.Body += "<td>Password : </td><td>aaaaaaaaaa</td>";
mail.Body += "</tr>";
mail.Body += "</table>";
mail.Body += "</body>";
mail.Body += "</html>";
mail.IsBodyHtml = true;
SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("sendfrommailaddress.com", "password");
SmtpServer.EnableSsl = true;
SmtpServer.Send(mail);
You can reffer it in Sending mail
If it's a new google account, you have to send an email (the first one) through the regular user interface. After that you can use your application/robot to send messages.
You should consider to specify SMTP configuration data in config file and do not overwrite them in a code - see SMTP configuration data at http://www.systemnetmail.com/faq/4.1.aspx
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="admin#example.com">
<network defaultCredentials="false" host="smtp.example.com" port="25" userName="admin#example.com" password="password"/>
</smtp>
</mailSettings>
</system.net>
I have encountered the same problem several times. After enabling less secure app option the problem resolved.
Enable less secure app from here: https://myaccount.google.com/lesssecureapps
hope this will help.
I created a Microsoft 365 Developer subscription (E5) today morning and used it to send a test email using the following settings
using (SmtpClient client = new SmtpClient())
{
client.EnableSsl = true;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential(username, password);
client.Host = "smtp.office365.com";
client.Port = 587;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(msg);
}
It did not work in the beginning, as I kept getting this error message with the exception thrown by this code. Then, I spent about 4+ hours playing with the Microsoft 365 admin centre settings and reading articles to figure out the issue. Ultimately I changed my Microsoft 365 admin centre password and it worked like a charm. So, it is worth to try changing the password when you get this message, before thinking about any advance solution.
Note that the password wasn't invalid for sure as I logged on to my Microsoft 365 account without any issues. however, the password change solved the issue.
After going through each of every proposed solution, I realized the correct answer depends on your current server and email client situation. In my case, I have the MX record pointing to my on-premise outbound server. Also, since I'm using G Suite and not Gmail to send my notification emails, I had to follow this configuration: https://support.google.com/a/answer/2956491?hl=en.
Having said this, I found the right way to make this work, is indeed configuring the SMTP relay service first from my G Suite account:
IPv6 address is the address of the webserver the MX record is pointing at (example: 1234:454:c88a:d8e7:25c0:2a9a:5aa2:104).
Once this is done, use this code to complement the solution:
//Set email provider credentials
SmtpClient smtpClient = new SmtpClient("smtp-relay.gmail.com", "587");
smtpClient.EnableSsl = true;
smtpClient.UseDefaultCredentials = true;
MailAddress from = new MailAddress("username#yourdomain.com", "EmailFromAlias");
MailAddress to = new MailAddress("destination#anydomain.com");
MailMessage = new MailMessage(from, to);
MailMessage.Subject = subject;
MyMailMessage.Body = message;
MyMailMessage.IsBodyHtml = false;
smtpClient.Send(MyMailMessage);
Please, notice that with this method, smtpClient.UseDefaultCredentials = true; and not false as suggested in other solutions. Also, since we use the IPv6 address to connect to the SMTP client, it's not required to specify the user name or password. Therefore, in my opinion, this is a more secure and safe approach.
some smtp servers (secure ones) requires you to supply both username and email, if its gmail then most chances its the 'Less Secure Sign-In' issue you need to address, otherwise you can try:
public static void SendEmail(string address, string subject,
string message, string email, string username, string password,
string smtp, int port)
{
var loginInfo = new NetworkCredential(username, password);
var msg = new MailMessage();
var smtpClient = new SmtpClient(smtp, port);
msg.From = new MailAddress(email);
msg.To.Add(new MailAddress(address));
msg.Subject = subject;
msg.Body = message;
msg.IsBodyHtml = true;
smtpClient.EnableSsl = true;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = loginInfo;
smtpClient.Send(msg);
}
notice that the email from and the username are different unlike some implementation that refers to them as the same.
calling this method can be done like so:
SendEmail("to-mail#gmail.com", "test", "Hi it worked!!",
"from-mail", "from-username", "from-password", "smtp", 587);
If you are in a test environment and do not want to set security settings you have to allow less secure apps via. this link in Gmail.
https://myaccount.google.com/lesssecureapps
I had the same issue, it was resolved by change password to strong password.
If you face this issue with Office 365 account. In Exchange Online, by default, the SMTP Client Authentication will be disabled for all Office 365 mailbox accounts. You have to manually enable SMTP Auth for the problematic account and check the case again. Check the below threads.
https://morgantechspace.com/2021/01/the-smtp-server-requires-a-secure-connection-or-the-client.html
https://learn.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/authenticated-client-smtp-submission
I have used the steps in this question and it worked for me.
My issue was that G suite didn't consider my password as strong and after changing it it worked perfectly.
If all mentioned solutions didn't help, try to use this URL - it helped me to unblock email sending at my website
https://g.co/allowaccess
that can be if:
1)the user or pass are wrong
2)not enable SSL
3)less secure app is not enable
4)you have not log in into the server with this mail
5)you have not set client.UseDefaultCredentials = false
Removing the port field worked in my case
After turning less secure option on and trying other solutions, if you are still facing the same problem try to use this overload:
client.Credentials = new NetworkCredential("mymailid", "mypassword");
instead of:
client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
I was also facing the issue like
'The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.0 Authentication Required'
then went through so much internet materials but it didn't helped me fully. How I solved it like
step1:smtp.gmail.com is gmail server so go to your account gmail settings->click on see all settings->Forwarding and IMAP/POP->check pop and imap is enabled ,if not enable it->Save changes.
step2-click on your gmail profile picture->click on Manage your google account->go to security tab->check for Access to less secure apps(this option will be available if you havent opt for two step verification)->by default google will set it as disable, make it enable to use your real gmail password working for sending email.
note:-Enabling gmail access for less secure apps,may be dangerous for you so i dont recommend this
step3:-if your account has two step verification enabled or want to use password other than your gmail Real password using app specific password then try this:-
click on your gmail profile picture->click on Manage your google account->go to security tab->search for APP PASSWORD->select any app name given->select any device name->click on generate->copy the 16-digit password and paste it into your app where you have to enter a gmail password in place of your real gmail password.

Sending Email to Gmail via .Net Framework C# [duplicate]

I want to send an email from my application and i have written following code for sending mail
MailMessage msg = new MailMessage();
msg.From = new MailAddress("mymailid");
msg.To.Add("receipientid");
msg.Subject = "test";
msg.Body = "Test Content";
msg.Priority = MailPriority.High;
SmtpClient client = new SmtpClient();
client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
client.Host = "smtp.gmail.com";
client.Port = 587;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.EnableSsl = true;
client.UseDefaultCredentials = true;
client.Send(msg);
I am running it on localhost so what mistake i am doing to send it.
When i send button it gives an error like
The SMTP server requires a secure connection or the client was not
authenticated. The server response was: 5.5.1 Authentication
Required.
Code in Web.config file
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="smtpServer" value="smtp.gmail.com" />
<add key="EnableSsl" value = "true"/>
<add key="smtpPort" value="587" />
<add key="smtpUser" value="sender#gmail.com" />
<add key="smtpPass" value="mypassword" />
<add key="adminEmail" value="sender#gmail.com" />
</appSettings>
<system.net>
<mailSettings>
<smtp from="sender#gmail.com">
<network host="smtp.gmail.com" password="mypassword" port="587" userName="sender#gmail.com" enableSsl="true"/>
</smtp>
</mailSettings>
</system.net>
what should i do to solve this error and send mail??
I have the same problem.
I have found this solution:
Google may block sign in attempts from some apps or devices that do not use modern security standards. Since these apps and devices are easier to break into, blocking them helps keep your account safer.
Some examples of apps that do not support the latest security standards include:
The Mail app on your iPhone or iPad with iOS 6 or below
The Mail app on your Windows phone preceding the 8.1 release
Some Desktop mail clients like Microsoft Outlook and Mozilla Thunderbird
Therefore, you have to enable Less Secure Sign-In (or Less secure app access) in your google account.
After sign into google account, go to:
https://www.google.com/settings/security/lesssecureapps
or
https://myaccount.google.com/lesssecureapps
In C#, you can use the following code:
using (MailMessage mail = new MailMessage())
{
mail.From = new MailAddress("email#gmail.com");
mail.To.Add("somebody#domain.com");
mail.Subject = "Hello World";
mail.Body = "<h1>Hello</h1>";
mail.IsBodyHtml = true;
mail.Attachments.Add(new Attachment("C:\\file.zip"));
using (SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587))
{
smtp.Credentials = new NetworkCredential("email#gmail.com", "password");
smtp.EnableSsl = true;
smtp.Send(mail);
}
}
First check for gmail's security related issues. You may have enabled double authentication in gmail. Also check your gmail inbox if you are getting any security alerts. In such cases check other answer of #mjb as below
Below is the very general thing that i always check first for such issues
client.UseDefaultCredentials = true;
set it to false.
Note #Joe King's answer - you must set client.UseDefaultCredentials before you set client.Credentials
Ensure you set SmtpClient.Credentials after calling SmtpClient.UseDefaultCredentials = false.
The order is important as setting SmtpClient.UseDefaultCredentials = false will reset SmtpClient.Credentials to null.
I've searched and tried different things for hours.. To summarize, I had to take into consideration the following points:
Use smtp.gmail.com instead of smtp.google.com
Use port 587
Set client.UseDefaultCredentials = false; before setting credentials
Turn on the Access for less secure apps
Set client.EnableSsl = true;
If these steps didn't help, check this answer.
Perhaps, you can find something useful on this System.Net.Mail FAQ too.
App Passwords helped me.
Go to https://myaccount.google.com/security.
Scroll down to "Signing in to Google".
Enable 2-Step Verification.
Add App Password.
Use the generated password in your code.
Try to login in your gmail account. it gets locked if you send emails by using gmail SMTP. I don't know the limit of emails you can send before it gets locked but if you login one time then it works again from code.
make sure your webconfig setting are good.
Try it this way, I just made some light changes:
MailMessage msg = new MailMessage();
msg.From = new MailAddress("mymailid#gmail.com");
msg.To.Add("receipientid#gmail.com");
msg.Subject = "test";
msg.Body = "Test Content";
//msg.Priority = MailPriority.High;
using (SmtpClient client = new SmtpClient())
{
client.EnableSsl = true;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("mymailid#gmail.com", "mypassword");
client.Host = "smtp.gmail.com";
client.Port = 587;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(msg);
}
Also please show your app.config file, if you have mail settings there.
As of May 30, 2022 less secure apps are no longer supported from Google so you have to use App Passwords.
https://support.google.com/accounts/answer/6010255?authuser=1&hl=en-GB&authuser=1&visit_id=637957424028050444-425688120&p=less-secure-apps&rd=1
Here are the steps to set up an app password via google:
https://support.google.com/accounts/answer/185833?authuser=1
Then you need to use the 16 character app password for the smtpClient's credentials:
smtpClient = new SmtpClient(emailHost)
{
Port = port,
DeliveryMethod = SmtpDeliveryMethod.Network,
Credentials = new NetworkCredential(fromEmail, emailPassword),
EnableSsl = true,
};
The emailpassword should be the 16 character generated App Password.
Port: 587
Emailhost: smtp.gmail.com
Then the rest of the code:
var mailMessage = new MailMessage{
From = new MailAddress(fromEmail),
Subject = "Yoursubject",
Body = $"Your body",
IsBodyHtml = true,
};
mailMessage.To.Add(newEmail);
if (smtpClient != null)
smtpClient.Send(mailMessage);
Turn on less secure app from this link and boom...
try to enable allow less secure app access.
Here, you can enable less secure app after login with your Gmail.
https://myaccount.google.com/lesssecureapps
Thanks.
For security reasons, Google has discontinued turning on Access for Less Secure Apps, effective from May 30, 2021. Hence, some of the answers here that emphasized enabling access for less secure apps have become obsolete.
Here is an answer I found on VB Forum and it worked for me. I was able to send a mail successfully.
"Please do following steps.
In Google Account Activate 2-step verification.
Select App Password in Google Account => Security => Signing to Google.
In Select App Combo Select Other and Name as Windows App & Click Generate it.
Copy Password and use it in place of email password.
It will work."
Check out the link to see more answers.
https://www.vbforums.com/showthread.php?895413-Sending-Email-via-Gmail-changing-for-May-30
Scroll down and see the answer posted by microbrain
See the code with which I sent my mail below:
Dim emailTo As String = TxtEmail.Text.Trim()
If emailTo.Length > 10 Then
Try
Dim Smtp_Server As New SmtpClient
Dim e_mail As New MailMessage()
Smtp_Server.UseDefaultCredentials = False
Smtp_Server.Credentials = New Net.NetworkCredential("myemail#gmail.com", "***16-digit-code***")
Smtp_Server.Port = 587
Smtp_Server.EnableSsl = True
Smtp_Server.Host = "smtp.gmail.com"
e_mail = New MailMessage()
e_mail.From = New MailAddress("myemailaddress#gmail.com")
e_mail.To.Add(emailTo)
e_mail.Subject = "Login OTP"
e_mail.IsBodyHtml = False
e_mail.Body = "some text here"
Smtp_Server.Send(e_mail)
MessageBox.Show("Your login OTP has been sent to " & emailTo)
LblOTPSuccess.Visible = True
TxtOTP.Visible = True
BtnVerifyOTP.Visible = True
TxtOTP.Focus()
Catch error_t As Exception
MessageBox.Show(error_t.ToString, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Else
MessageBox.Show("Email address is invalid or too short", "Invalid Email", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Remember to change the parameters in the code to suit you.
I encountered the same problem even I set "UseDefaultCredentials" to false. Later I found that the root cause is that I turned on "2-step Verification" in my account. After I turned it off, the problem is gone.
Make sure that Access less secure app is allowed.
MailMessage mail = new MailMessage();
mail.From = new MailAddress("xx#gmail.com");
mail.Sender = new MailAddress("xx#gmail.com");
mail.To.Add("external#emailaddress");
mail.IsBodyHtml = true;
mail.Subject = "Email Sent";
mail.Body = "Body content from";
SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
smtp.UseDefaultCredentials = false;
smtp.Credentials = new System.Net.NetworkCredential("xx#gmail.com", "xx");
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.EnableSsl = true;
smtp.Timeout = 30000;
try
{
smtp.Send(mail);
}
catch (SmtpException e)
{
textBox1.Text= e.Message;
}
In my case, I was facing the same issue. After a long research, don't set UseDefaultCredentials value to false. Because default value of UseDefaultCredentials is false.
Another key point is to set network credential just before the client.send(message) statement.
Wrong Code:
SmtpClient client = new SmtpClient();
client.Host = ServerName;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = false;
client.Send(message);
Wrong Code:
SmtpClient client = new SmtpClient();
client.Host = ServerName;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = true;
client.Send(message);
Correct code
SmtpClient client = new SmtpClient();
client.Host = ServerName;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
// client.UseDefaultCredentials = true;
client.Send(message);
Correct code
SmtpClient client = new SmtpClient();
client.Host = ServerName;
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = false;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Send(message);
Now its working ok with both corrected codes. So in this case sequence matters.
Cheers!
Below is my code.I also had the same error but the problem was that i gave my password wrong.The below code will work perfectly..try it
MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
mail.From = new MailAddress("fromaddress#gmail.com");
mail.To.Add("toaddress1#gmail.com");
mail.To.Add("toaddress2#gmail.com");
mail.Subject = "Password Recovery ";
mail.Body += " <html>";
mail.Body += "<body>";
mail.Body += "<table>";
mail.Body += "<tr>";
mail.Body += "<td>User Name : </td><td> HAi </td>";
mail.Body += "</tr>";
mail.Body += "<tr>";
mail.Body += "<td>Password : </td><td>aaaaaaaaaa</td>";
mail.Body += "</tr>";
mail.Body += "</table>";
mail.Body += "</body>";
mail.Body += "</html>";
mail.IsBodyHtml = true;
SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("sendfrommailaddress.com", "password");
SmtpServer.EnableSsl = true;
SmtpServer.Send(mail);
You can reffer it in Sending mail
If it's a new google account, you have to send an email (the first one) through the regular user interface. After that you can use your application/robot to send messages.
You should consider to specify SMTP configuration data in config file and do not overwrite them in a code - see SMTP configuration data at http://www.systemnetmail.com/faq/4.1.aspx
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="admin#example.com">
<network defaultCredentials="false" host="smtp.example.com" port="25" userName="admin#example.com" password="password"/>
</smtp>
</mailSettings>
</system.net>
I have encountered the same problem several times. After enabling less secure app option the problem resolved.
Enable less secure app from here: https://myaccount.google.com/lesssecureapps
hope this will help.
I created a Microsoft 365 Developer subscription (E5) today morning and used it to send a test email using the following settings
using (SmtpClient client = new SmtpClient())
{
client.EnableSsl = true;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential(username, password);
client.Host = "smtp.office365.com";
client.Port = 587;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(msg);
}
It did not work in the beginning, as I kept getting this error message with the exception thrown by this code. Then, I spent about 4+ hours playing with the Microsoft 365 admin centre settings and reading articles to figure out the issue. Ultimately I changed my Microsoft 365 admin centre password and it worked like a charm. So, it is worth to try changing the password when you get this message, before thinking about any advance solution.
Note that the password wasn't invalid for sure as I logged on to my Microsoft 365 account without any issues. however, the password change solved the issue.
After going through each of every proposed solution, I realized the correct answer depends on your current server and email client situation. In my case, I have the MX record pointing to my on-premise outbound server. Also, since I'm using G Suite and not Gmail to send my notification emails, I had to follow this configuration: https://support.google.com/a/answer/2956491?hl=en.
Having said this, I found the right way to make this work, is indeed configuring the SMTP relay service first from my G Suite account:
IPv6 address is the address of the webserver the MX record is pointing at (example: 1234:454:c88a:d8e7:25c0:2a9a:5aa2:104).
Once this is done, use this code to complement the solution:
//Set email provider credentials
SmtpClient smtpClient = new SmtpClient("smtp-relay.gmail.com", "587");
smtpClient.EnableSsl = true;
smtpClient.UseDefaultCredentials = true;
MailAddress from = new MailAddress("username#yourdomain.com", "EmailFromAlias");
MailAddress to = new MailAddress("destination#anydomain.com");
MailMessage = new MailMessage(from, to);
MailMessage.Subject = subject;
MyMailMessage.Body = message;
MyMailMessage.IsBodyHtml = false;
smtpClient.Send(MyMailMessage);
Please, notice that with this method, smtpClient.UseDefaultCredentials = true; and not false as suggested in other solutions. Also, since we use the IPv6 address to connect to the SMTP client, it's not required to specify the user name or password. Therefore, in my opinion, this is a more secure and safe approach.
some smtp servers (secure ones) requires you to supply both username and email, if its gmail then most chances its the 'Less Secure Sign-In' issue you need to address, otherwise you can try:
public static void SendEmail(string address, string subject,
string message, string email, string username, string password,
string smtp, int port)
{
var loginInfo = new NetworkCredential(username, password);
var msg = new MailMessage();
var smtpClient = new SmtpClient(smtp, port);
msg.From = new MailAddress(email);
msg.To.Add(new MailAddress(address));
msg.Subject = subject;
msg.Body = message;
msg.IsBodyHtml = true;
smtpClient.EnableSsl = true;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = loginInfo;
smtpClient.Send(msg);
}
notice that the email from and the username are different unlike some implementation that refers to them as the same.
calling this method can be done like so:
SendEmail("to-mail#gmail.com", "test", "Hi it worked!!",
"from-mail", "from-username", "from-password", "smtp", 587);
If you are in a test environment and do not want to set security settings you have to allow less secure apps via. this link in Gmail.
https://myaccount.google.com/lesssecureapps
I had the same issue, it was resolved by change password to strong password.
If you face this issue with Office 365 account. In Exchange Online, by default, the SMTP Client Authentication will be disabled for all Office 365 mailbox accounts. You have to manually enable SMTP Auth for the problematic account and check the case again. Check the below threads.
https://morgantechspace.com/2021/01/the-smtp-server-requires-a-secure-connection-or-the-client.html
https://learn.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/authenticated-client-smtp-submission
I have used the steps in this question and it worked for me.
My issue was that G suite didn't consider my password as strong and after changing it it worked perfectly.
If all mentioned solutions didn't help, try to use this URL - it helped me to unblock email sending at my website
https://g.co/allowaccess
that can be if:
1)the user or pass are wrong
2)not enable SSL
3)less secure app is not enable
4)you have not log in into the server with this mail
5)you have not set client.UseDefaultCredentials = false
Removing the port field worked in my case
After turning less secure option on and trying other solutions, if you are still facing the same problem try to use this overload:
client.Credentials = new NetworkCredential("mymailid", "mypassword");
instead of:
client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
I was also facing the issue like
'The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.0 Authentication Required'
then went through so much internet materials but it didn't helped me fully. How I solved it like
step1:smtp.gmail.com is gmail server so go to your account gmail settings->click on see all settings->Forwarding and IMAP/POP->check pop and imap is enabled ,if not enable it->Save changes.
step2-click on your gmail profile picture->click on Manage your google account->go to security tab->check for Access to less secure apps(this option will be available if you havent opt for two step verification)->by default google will set it as disable, make it enable to use your real gmail password working for sending email.
note:-Enabling gmail access for less secure apps,may be dangerous for you so i dont recommend this
step3:-if your account has two step verification enabled or want to use password other than your gmail Real password using app specific password then try this:-
click on your gmail profile picture->click on Manage your google account->go to security tab->search for APP PASSWORD->select any app name given->select any device name->click on generate->copy the 16-digit password and paste it into your app where you have to enter a gmail password in place of your real gmail password.

Sending email through my hotmail account and changing the 'from'

I build a web form on my website to allow visitors to send me a message. Something very basic (for my personal use). On my backend (c# .Net MVC) I use SmtpClient to send the mail. I use my hotmail account for that purpose. It works. Please note that from is equal to the username used in Credentials.
SmtpClient _client = new SmtpClient();
_client.Host = "smtp.live.com";
_client.Port = 587;
_client.UseDefaultCredentials = true;
_client.Credentials = new System.Net.NetworkCredential("ttttt#hotmail.com", "mypassword");
_client.EnableSsl = true;
_client.DeliveryMethod = SmtpDeliveryMethod.Network;
MailAddress to = new MailAddress("ttttt#gmail.com");
MailAddress from = new MailAddress("ttttt#hotmail.com");
MailMessage mail = new MailMessage(from, to);
mail.Subject = "The subject";
mail.Body = "The message";
_client.Send(mail);
When I receive the mail, the sender is equal to the receiver ( myself :) This is not ideal.
From: John Doe
To: John Doe
Subject: My subject
Message: My message
I would prefer having the visitor's email address in the sender (the from). So I try to change that but it doesn't work. I got the error message below:
System.Net.Mail.SmtpException Transaction failed. The server response was: 5.2.0 STOREDRV.Submission.Exception:SendAsDeniedException.MapiExceptionSendAsDenied; Failed to process message due to a permanent exception with message Cannot submit message.
I understand that this is not working for security reason. I cannot send an email 'in the name of' someone else.
Before giving up, I come here in the hope of someone can suggest me an alternative.
PS: I know I can use mail.ReplyToList.Add(emailofvisitor); then when I press Reply this is the visitor's email which is used but this is not still ideal because I still see my ttttt#hotmail.com in the from field.
Hope I didn't misunderstand your request, I'm assuming you would like to change the displayed name for the sender, this is what I do in my project, Add the following to your Web.Config or App.Config file:
Fill the from part with whatever you want and it will show it as the sender name.
<system.net>
<mailSettings>
<smtp from="YourDisplayName <YourEmail>" deliveryMethod="Network">
<network defaultCredentials="false" enableSsl="true" host="hostname" port="587" userName="yourusername" password="yourpassword"/>
</smtp>
</mailSettings>
</system.net>
C# code:
SmtpClient smtpClient = new SmtpClient();
var smtpSection = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");
MailMessage message = new MailMessage();
message.From = new MailAddress(smtpSection.From);
MailAddress to = new MailAddress("youremail#gmail.com");
message.To.Add(to);
message.Subject = "The subject";
message.Body = "The message";
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.Send(message);

How do I send e-mail from an AT&T residential account with System.Net.Mail.SmtpClient?

Apologies if this should be on SuperUser, but this appears to be a .NET configuration issue I'm having rather than an issue with my ISP.
I'm trying to send out e-mail using System.Net.Mail.SmtpClient. I'm on an AT&T Uverse residential line, so outbound port 25 is completely blocked and the only way to send e-mail is through their approved SMTP server, over port 465, over SSL. The settings can be found here: https://www.att.com/esupport/article.jsp?sid=KB401570&ct=9000812. When I try to send e-mail using what I assume are the correct settings for SmtpClient, all I get is "System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host."
Here's my code:
var client = new SmtpClient();
client.Host = "smtp.att.yahoo.com";
client.Port = 465;
client.EnableSsl = true;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("email#bellsouth.net", "password");
client.DeliveryMethod = SmtpDeliveryMethod.Network;
var message = new MailMessage();
message.From = new MailAddress("email#bellsouth.net");
message.To.Add(new MailAddress("foo#gmail.com"));
message.Subject = "Subject";
message.Body = "This is the body";
client.Send(message);
The exception occurs on the call to client.Send(message). I've also tried using App.config as follows:
<configuration>
<system.net>
<mailSettings>
<smtp deliveryMethod="Network">
<network
host="smtp.att.yahoo.com"
port="465"
defaultCredentials="false"
enableSsl="true"
userName="email#bellsouth.net"
password="password"
/>
</smtp>
</mailSettings>
</system.net>
</configuration>
and just left by C# code as:
var client = new SmtpClient();
var message = new MailMessage();
message.From = new MailAddress("email#bellsouth.net");
message.To.Add(new MailAddress("foo#gmail.com"));
message.Subject = "Subject";
message.Body = "This is the body";
client.Send(message);
Are there other settings I should be using? Has anyone had success in sending e-mail from .NET through smtp.att.yahoo.com? I can say that this does work in Outlook, so it's not like there's some block somewhere.
EDIT: Gmail is out because I need to be able to keep the from address dynamic and gmail forces the sender to the account. i.e. I have a domain and I need to be able to send from #mydomain.com.
I've managed to send emails through smtp.att.yahoo.com using the non secure port 587:
client.Port = 587;
client.EnableSsl = false;

Send Email via C# through Google Apps account

I have a standard Google Apps account. I have setup a custom domain through Google Apps. I am able to send and receive emails successfully through Google Apps when I use the Gmail interface. However, I want to send an email via code. In order to attempt this, I have been trying the following code:
MailMessage mailMessage = new MailMessage();
mailMessage.To.Add("someone#somewhere.example");
mailMessage.Subject = "Test";
mailMessage.Body = "<html><body>This is a test</body></html>";
mailMessage.IsBodyHtml = true;
// Create the credentials to login to the gmail account associated with my custom domain
string sendEmailsFrom = "emailAddress#mydomain.example";
string sendEmailsFromPassword = "password";
NetworkCredential cred = new NetworkCredential(sendEmailsFrom, sendEmailsFromPassword);
SmtpClient mailClient = new SmtpClient("smtp.gmail.com", 587);
mailClient.EnableSsl = true;
mailClient.DeliveryMethod = SmtpDeliveryMethod.Network;
mailClient.UseDefaultCredentials = false;
mailClient.Timeout = 20000;
mailClient.Credentials = cred;
mailClient.Send(mailMessage);
When the Send method is reached, an Exception is thrown that states:
"The SMTP server requires a secure
connection or the client was not
authenticated. The server response
was: 5.5.1 Authentication Required."
How do I send emails through my custom domain via Google?
There is no need to hardcode all SMTP settings in your code. Put them in web.config instead. This way you can encrypt these settings if needed and change them on the fly without recompiling your application.
<configuration>
<system.net>
<mailSettings>
<smtp from="example#domain.example" deliveryMethod="Network">
<network host="smtp.gmail.com" port="587"
userName="example#domain.example" password="password"/>
</smtp>
</mailSettings>
</system.net>
</configuration>
End when you send email just enable SSL on your SmtpClient:
var message = new MailMessage("navin#php.net");
// here is an important part:
message.From = new MailAddress("example#domain.example", "Mailer");
// it's superfluous part here since from address is defined in .config file
// in my example. But since you don't use .config file, you will need it.
var client = new SmtpClient();
client.EnableSsl = true;
client.Send(message);
Make sure that you're sending email from the same email address with which you're trying to authenticate at Gmail.
Note: Starting with .NET 4.0 you can insert enableSsl="true" into web.config as opposed to setting it in code.
This is what I use in WPF 4
SmtpClient client = new SmtpClient();
client.Credentials = new NetworkCredential("sender_email#domain.tld", "P#$$w0rD");
client.Port = 587;
client.Host = "smtp.gmail.com";
client.EnableSsl = true;
try
{
MailAddress maFrom = new MailAddress("sender_email#domain.tld", "Sender's Name", Encoding.UTF8),
MailAddress maTo = new MailAddress("recipient_email#domain2.tld", "Recipient's Name", Encoding.UTF8);
MailMessage mmsg = new MailMessage(maFrom, maTo);
mmsg.Body = "<html><body><h1>Some HTML Text for Test as BODY</h1></body></html>";
mmsg.BodyEncoding = Encoding.UTF8;
mmsg.IsBodyHtml = true;
mmsg.Subject = "Some Other Text as Subject";
mmsg.SubjectEncoding = Encoding.UTF8;
client.Send(mmsg);
MessageBox.Show("Done");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), ex.Message);
//throw;
}
Watch for Firewalls and Anti-Viruses. These creepy things tend to block applications sending email.
I use McAfee Enterprise and I have to add the executable name (like Bazar.* for both Bazar.exe and Bazar.vshost.exe) to be able to send emails...
change the port to 465
There is not need to do anything. Just login in your current account first time and follow instructions.
Your problem will resolve. It occur because you had created the account in google apps but did not login. Just login and follow the instructions and try.
My code is connecting to smtp.google.com using TLS on Port=587 (SSL should be port 465) but still needs EnableSsl=true
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com";
smtp.Port = 587;
smtp.EnableSsl = true;
smtp.UseDefaultCredentials = false;
NetworkCredential credentials = new NetworkCredential();
credentials.UserName = "INSERT EMAIL";
credentials.Password = "INSERT PASSWORD";
smtp.Credentials = credentials;
MailAddress addressFrom = new MailAddress(credentials.UserName);
MailAddress addressTo = new MailAddress("INSERT RECIPIENT");
MailMessage msg = new MailMessage(addressFrom, addressTo);
msg.Subject = "SUBJECT"
msg.Body = "BODY";
smtp.Send(msg);
Notice these important prerequisites on your G SUITE account
Ensure that the username you use has cleared the CAPTCHA word verification test that appears when you first sign in.
Ensure that the account has a secure password - https://support.google.com/accounts/answer/32040
Make sure that Less secure apps is enabled for the desired account- https://support.google.com/a/answer/6260879

Categories

Resources