How to read system.net/mailSettings/smtp from Web.config - c#

This is my web.config mail settings:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="smthg#smthg.net">
<network defaultCredentials="true" host="localhost" port="587" userName="smthg#smthg.net" password="123456"/>
</smtp>
</mailSettings>
</system.net>
and here's how I try to read the values from web.config
var smtp = new System.Net.Mail.SmtpClient();
var credential = new System.Net.Configuration.SmtpSection().Network;
string strHost = smtp.Host;
int port = smtp.Port;
string strUserName = credential.UserName;
string strFromPass = credential.Password;
But credentials are always null. How can i access these values?

Since no answer has been accepted, and none of the others worked for me:
using System.Configuration;
using System.Net.Configuration;
// snip...
var smtpSection = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");
string username = smtpSection.Network.UserName;

It is not necessary to use the ConfigurationManagerand get the values manually. Simply instantiating an SmtpClient is sufficient.
SmtpClient client = new SmtpClient();
This is what MSDN says:
This constructor initializes the Host, Credentials, and Port properties for the new SmtpClient by using the settings in the application or machine configuration files.
Scott Guthrie wrote a small post on that some time ago.

By using the configuration, the following line:
var smtp = new System.Net.Mail.SmtpClient();
Will use the configured values - you don't need to access and assign them again.
As for the null values - you are trying accessing the configuration values incorrectly. You are just creating an empty SmtpSection instead of reading it from configuration.
var smtpSection = (SmtpSection)ConfigurationManager.GetSection("<the section name>");
var credentials == smtpSection.Network;

I think if you have defaultCredentials="true" set you will have the credentials = null as you are not using them.
Does the email Send when you call the .Send method?
So
This is my web config mail settings:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="smthg#smthg.net">
<network defaultCredentials="false" host="localhost" port="587"
userName="smthg#smthg.net" password="123456"/>
</smtp>
</mailSettings>
</system.net>
and this is cs
SmtpClient smtpClient = new SmtpClient();
string smtpDetails =
#"
DeliveryMethod = {0},
Host = {1},
PickupDirectoryLocation = {2},
Port = {3},
TargetName = {4},
UseDefaultCredentials = {5}";
Console.WriteLine(smtpDetails,
smtpClient.DeliveryMethod.ToString(),
smtpClient.Host,
smtpClient.PickupDirectoryLocation == null
? "Not Set"
: smtpClient.PickupDirectoryLocation.ToString(),
smtpClient.Port,
smtpClient.TargetName,
smtpClient.UseDefaultCredentials.ToString)
);

//You can access the network credentials in the following way.
//Read the SmtpClient section from the config file
var smtp = new System.Net.Mail.SmtpClient();
//Cast the newtwork credentials in to the NetworkCredential class and use it .
var credential = (System.Net.NetworkCredential)smtp.Credentials;
string strHost = smtp.Host;
int port = smtp.Port;
string strUserName = credential.UserName;
string strFromPass = credential.Password;

make sure you have reference to System.Net in your application

Set defaultCredentials="false", because when it's set to true, no credentials are used.

Related

How set smtp credential in .net

I have a contact us page that user fill contents and contents send to email like info#mywebsitename.com. in .net we define credential for smtp :
var body = c.Subject.ToString() + " from: " + c.Name + " " + c.Email + "\n\n" + c.Body;
var mailMessage = new MailMessage(c.Email, "info#mysitename.com", c.Subject.ToString(), body);
var mailAddr = new MailAddress(c.Email);
var smtpClient = new SmtpClient();
smtpClient.Host = "mail.mysitename.com";
**smtpClient.Credentials = new NetworkCredential("info#mysitename.com", "Test123");**
smtpClient.send();
any works well.
but if User change password of info#mywebsitename.com, this credential is not valid. it's a human right that user have access to password and change it! so how have valid credential for ever that customers can send email to info and site owner can reply to them and can change password.
I know can set in web.config. Is there way for dynamically set password.
you want something like this.
<system.net>
<mailSettings>
<smtp from="email#yourdomain.com" deliveryMethod="Network">
<network defaultCredentials="false" host="yourdomain" password="password" userName="username"/>
</smtp>
</mailSettings>
</system.net>
I think you have to set the property 'UseDefaultCredentials' of 'SmtpClient' to false. Depending on your email server you will eventually have to set 'EnableSsl' to true. Here is a sample of code which I have used to successfully connect to Gmail:
SmtpClient smtp = new SmtpClient("smtp.googlemail.com");
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential("myaccountname#gmail.com", "mypassword");
smtp.EnableSsl = true;

Error with changing SMTP Settings to use Config rather than setting it up in .cs

Currently my WPF application has the SMTP set up as followed:
string MailTo = txtBoxEmail.Text;
string MailFrom = "datfakeemaildoe#gmail.com ";
string Subject = "Cool Subject";
string Password = "*******";
SmtpClient smtpmail = new SmtpClient();
smtpmail.Host = "smtp.gmail.com";
smtpmail.Port = 587;
smtpmail.EnableSsl = true;
smtpmail.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpmail.UseDefaultCredentials = false;
smtpmail.Credentials = new NetworkCredential(MailFrom, Password);
MailMessage message = new MailMessage(MailFrom, MailTo, Subject, MessageTosend);
message.IsBodyHtml = true;
However, I'd like to manage all of this in the config rather than the .cs if possible.
Currently, I set up my App.Config as followed:
<configuration>
<appSettings>
<add key="host" value="smtp.gmail.com" />
<add key="port" value="587" />
<add key="MailFrom" value="datfakeemaildoe#gmail.com" />
<add key="Password" value="*******" />
</appSettings>
</configuration>
Problem is, how to I implement it properly now in the .cs
I tried this:
using System.Configuration;
using System.Net.Configuration;
using System.Net;
using System.Net.Mail;
...
private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
...
string MessageTosend = #"there is html in here, trust me";
MailAddress Sender = new MailAddress(ConfigurationManager.AppSettings["MailFrom"]);
string MailTo = txtBoxEmail.Text;
string Subject = "Cool Subject";
SmtpClient smtp = new SmtpClient()
{
host = ConfigurationManager.AppSettings["host"],
port = Convert.ToInt32(ConfigurationManager.AppSettings["port"]),
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network;
UseDefaultCredentials = false;
Credentials = new System.Net.NetworkCredential(ConfigurationManager.AppSettings["MailFrom"], ConfigurationManager.AppSettings["Password"])
};
MailMessage message = new MailMessage(ConfigurationManager.AppSettings["MailFrom, MailTo, Subject, MessageTosend);
message.IsBodyHtml = true;
...
BUT ConfigurationManager is generating an error that says does not exist in the current context, even though I have...
using System.Configuration;
using System.Net.Configuration;
using System.Net;
using System.Net.Mail;
...already. I just want to be able to change SMTP settings in the config rather than having to update the code behind for my application in case things change later.
Not sure if I'm doing it wrong or if I'm just missing something entirely. I referenced this to know how to use the app.config.
As stated on Scott Gu's blog, there's already a section in .config specifically for these settings, no need to do it in App Settings. The .NET framework automatically reads these settings in without the need to write C# to do it. Here's the MSDN documentation.
Example:
<system.net>
<mailSettings>
<smtp from="test#foo.com">
<network host="smtpserver1" port="25" userName="username" password="secret" defaultCredentials="true" />
</smtp>
</mailSettings>
</system.net>
No need to specify any code for loading of the configuration.
Figured out the ConfigurationManager problem.
While <system.net><mailSettings> ... works, so does my original <appSettings>. The reason why ConfigurationManager was running into a issue was because System.Configuration.dll was missing in my references (source)
Adding this, I was able to call the keys I added in my App.config
Then I changed the way it was used in the .cs
SmtpClient smtpmail = new SmtpClient();
smtpmail.Host = ConfigurationManager.AppSettings["host"];
smtpmail.Port = Convert.ToInt32(ConfigurationManager.AppSettings["port"]);
smtpmail.EnableSsl = true;
smtpmail.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpmail.UseDefaultCredentials = false;
smtpmail.Credentials = new System.Net.NetworkCredential(ConfigurationManager.AppSettings["MailFrom"], ConfigurationManager.AppSettings["Password"]);
MailMessage message = new MailMessage(ConfigurationManager.AppSettings["MailFrom"], MailTo, Subject, MessageTosend);
message.IsBodyHtml = true;
Worked like a charm. :)

Sending mail Using C# asp.net [duplicate]

This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
send email asp.net c#
I have sent mail several times using the technique several times before but somehow it doesnt work i am providing the code in the following:
MailMessage myMailMessage = new MailMessage();
myMailMessage.Subject = "Response From Client";
myMailMessage.Body = "hello word";
myMailMessage.From = new MailAddress("mymail#gmail.com", "jub");
myMailMessage.To.Add(new MailAddress("mymail#gmail.com", "Softden"));
SmtpClient mySmtpClient = new SmtpClient();
mySmtpClient.Send(myMailMessage);
and my web.config is:
<mailSettings>
<smtp deliveryMethod = "Network" from="Jubair <mymail#gmail.com>">
<network defaultCredentials="false" enableSsl="true" userName="mymail#gmail.com" password="Mypassword" host="smtp.gmail.com" port="587"></network>
</smtp>
</mailSettings>
it says the smtp server requires a secure connection or the client was not authenticated.. Please help
Try adding something like this
Per Dominic's answer on Stackoverflow look at he following example
using System.Net;
using System.Net.Mail;
var fromAddress = new MailAddress("from#gmail.com", "From Name");
var toAddress = new MailAddress("to#example.com", "To Name");
const string fromPassword = "fromPassword";
const string subject = "Subject";
const string body = "Body";
var smtp = new SmtpClient
{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
//UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body
})
{
smtp.Send(message);
}
//----------------- A simple approach below ---------------
I just tested this below and it works
var mail = new MailMessage();
// Set the to and from addresses.
// The from address must be your GMail account
mail.From = new MailAddress("noreplyXYZ#gmail.com");
mail.To.Add(new MailAddress(to));
// Define the message
mail.Subject = subject;
mail.IsBodyHtml = isHtml;
mail.Body = message;
// Create a new Smpt Client using Google's servers
var mailclient = new SmtpClient();
mailclient.Host = "smtp.gmail.com";//ForGmail
mailclient.Port = 587; //ForGmail
// This is the critical part, you must enable SSL
mailclient.EnableSsl = true;//ForGmail
//mailclient.EnableSsl = false;
mailclient.UseDefaultCredentials = true;
// Specify your authentication details
mailclient.Credentials = new System.Net.NetworkCredential("fromAddress#gmail.com", "xxxx123");//ForGmail
mailclient.Send(mail);
mailclient.Dispose();
//The .config settings there are two options on how you could set this up I am suspecting that this is the issue you are having
<system.net>
<mailSettings>
<smtp from="from#gmail.com" deliveryMethod="Network">
<network userName="from#gmail.com" password="mypassword" host="smtp.gmail.com" port="587"/>
</smtp>
</mailSettings>
</system.net>
or option 2
<configuration>
<appSettings>
<add key="smtpClientHost" value="mail.localhost.com"/> //SMTP Client host name
<add key="portNumber" value="587"/>
<add key="fromAddress" value="yourEmailAddress#gmail.com"/>
</appSettings>
</configuration>
Send Email from Yahoo, Gmail, Hotmail (C#)
http://www.codeproject.com/Tips/520998/Send-Email-from-Yahoo-Gmail-Hotmail-Csharp
These are evry good tutorials with samples. make your demo email id. pass your id and its password as parameters. and send mail to anyone.
http://www.codeproject.com/Articles/15807/Easy-SMTP-Mail-Using-ASP-NET-2-0
http://www.codeproject.com/Tips/371417/Send-Mail-Contact-Form-using-ASP-NET-and-Csharp
http://www.codeproject.com/Tips/490604/Sending-mail-using-ASP-NET-with-optional-parameter
if you are still unable to send email make sure to change the port number. but 587 should work normally.
Make sure you contact the email server side to see what kind of authentication they accept to relay.

SmtpClient .send() error: "message rejected as spam by content filtering"

Here is the code i wrote to send email,
MailMessage m = new MailMessage();
SmtpClient sc = new SmtpClient();
sc.UseDefaultCredentials = false;
try
{
m.From = new MailAddress(Sender);
m.To.Add(new MailAddress(Receiver));
m.Subject = Subject;
m.IsBodyHtml = true;
m.Body = Body;
sc.Send(m);
}
catch (Exception ex) { _Exceptions.ManageExceptions(ex); }
And the config file settings:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="xxx#xxx.com">
<network host="192.168.0.170" userName="setsdom01\user1" password="xxx" port="25" />
</smtp>
</mailSettings>
</system.net>
It executes when i run it from my machine, i try on different PC and it is giving me the following message: ...message rejected as spam by content filtering..
What could be the problem?
I think you need to add NetworkCredential backend code.
var AuthenticationDetails = new NetworkCredential("xxx#", "xxxx");
sc.Credentials = AuthenticationDetails;
This might work
Also look this How to Enable and Configure the Spam Confidence Level Thresholds may be helpful

How to programmatically retrieve smtp server details from web.config

I have the following SMTP details stored in web.config
<system.net>
<mailSettings>
<smtp from="isds#ixtent.com">
<network host="mail.domain.com" port="25" userName="username" password="password" defaultCredentials="true"/>
</smtp>
</mailSettings>
</system.net>
How can I retrieve these values from within a c# class.
Configuration configurationFile = WebConfigurationManager
.OpenWebConfiguration("~/web.config");
MailSettingsSectionGroup mailSettings = configurationFile
.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;
if (mailSettings != null)
{
int port = mailSettings.Smtp.Network.Port;
string host = mailSettings.Smtp.Network.Host;
string password = mailSettings.Smtp.Network.Password;
string username = mailSettings.Smtp.Network.UserName;
}
If you need to send email with this mail-server-details you don't need to read the settings and apply. These settings are applied implicitly in the application.
If you are reading it for any other reason I was about to write something similar to Darin's answer. But just as I was writing I found he answered so please refer to his answer if you actually need to read. :)
What about:
string fullpath = #"C:\FullPath\YourFile.config";
string configSection = "system.net/mailSettings";
Configuration config = ConfigurationManager.OpenExeConfiguration(fullpath);
MailSettingsSectionGroup settings =
config.GetSectionGroup(configSection) as MailSettingsSectionGroup;

Categories