66

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?

Jim Aho
  • 9,932
  • 15
  • 56
  • 87
nermik
  • 1,485
  • 4
  • 16
  • 24

7 Answers7

115

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;
Darren Griffith
  • 3,290
  • 3
  • 28
  • 35
38

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.

bertl
  • 2,084
  • 1
  • 15
  • 12
  • Though that doesn't tell you if, for instance, [`SpecifiedPickupDirectory`](https://learn.microsoft.com/en-us/dotnet/api/system.net.configuration.smtpsection.specifiedpickupdirectory?view=netframework-4.8) is being used -- in which case you might need to turn `EnableSSL` off in your SMTP init code to avoid 'SSL must not be enabled for pickup-directory delivery methods.'. 2¢, etc... – ruffin Jan 13 '20 at 16:06
9

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;
Oded
  • 489,969
  • 99
  • 883
  • 1,009
  • If you wanted to say it; var smtp = new System.Net.Mail.SmtpClient(); string strUserName = smtp .UserName; string strFromPass = smtp .Password; I can't access like this. – nermik Nov 19 '12 at 11:20
  • @nermik - I don't know what you mean. – Oded Nov 19 '12 at 11:21
  • I just want to access UserName and Password from web.config like Host and port. – nermik Nov 19 '12 at 11:26
  • var smtpSection = (SmtpSection)ConfigurationManager.GetSection(""); I used it but still null. – nermik Nov 19 '12 at 11:43
3

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)
);
Owen Blacker
  • 4,117
  • 2
  • 33
  • 70
Doiremik
  • 265
  • 1
  • 6
  • 21
  • Nope, that's not the issue here. The OP is creating a new `SmtpSection` instead of reading it from the configuration. – Oded Nov 19 '12 at 11:20
  • Emmh just seen that.. so if you just call SmtpClient smtpClient = new SmtpClient(); it should read the condig settings for you but I'm nearly sure I also remember something around the default credentitals being true... I'll check it – Doiremik Nov 19 '12 at 11:23
  • Yes if you use default credentials the Username and pwd should be empty. As Oded said... now create a new credential... just instantite your SmtpClient like SmtpClient smtpClient = new SmtpClient(); and check the settings – Doiremik Nov 19 '12 at 11:25
  • ok so to use the UserName and Pwd from your config... set.. network defaultCredentials="false" – Doiremik Nov 19 '12 at 11:31
3
            //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;
0

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

Amr Elgarhy
  • 66,568
  • 69
  • 184
  • 301
-1

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

Mattis
  • 1