如何从 Web.config 读取 system.net/mailSettings/smtp

Posted

技术标签:

【中文标题】如何从 Web.config 读取 system.net/mailSettings/smtp【英文标题】:How to read system.net/mailSettings/smtp from Web.config 【发布时间】:2012-11-07 07:11:51 【问题描述】:

这是我的web.config 邮件设置:

<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>

这是我尝试从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;

但凭据始终为空。我如何访问这些值?

【问题讨论】:

【参考方案1】:

因为没有答案被接受,其他人都没有为我工作:

using System.Configuration;
using System.Net.Configuration;
// snip...
var smtpSection = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");
string username = smtpSection.Network.UserName;

【讨论】:

这是更好的答案 这对我不起作用。每次我得到null..代码都和这里一样..我错过了什么?【参考方案2】:

不必使用ConfigurationManager 并手动获取值。只需实例化 SmtpClient 就足够了。

SmtpClient client = new SmtpClient();

MSDN 是这么说的:

此构造函数使用应用程序或机器配置文件中的设置初始化新 SmtpClient 的 Host、Credentials 和 Port 属性。

Scott Guthrie 前段时间为此写了一个小 post。

【讨论】:

虽然这并不能告诉您,例如,SpecifiedPickupDirectory 是否正在被使用——在这种情况下,您可能需要在 SMTP 初始化代码中关闭 EnableSSL 以避免“SSL 必须没有为取货目录交付方法启用。'。 2美分等...【参考方案3】:

通过使用配置,下面这行:

var smtp = new System.Net.Mail.SmtpClient();

将使用配置的值 - 您无需再次访问和分配它们。


至于null 值 - 您正在尝试错误地访问配置值。您只是在创建一个空的 SmtpSection,而不是从配置中读取它。

var smtpSection = (SmtpSection)ConfigurationManager.GetSection("<the section name>");
var credentials == smtpSection.Network;

【讨论】:

如果你想说的话; var smtp = new System.Net.Mail.SmtpClient();字符串 strUserName = smtp .UserName;字符串 strFromPass = smtp .Password;我不能这样访问。 @nermik - 我不明白你的意思。 我只想从 web.config 中访问用户名和密码,比如主机和端口。 var smtpSection = (SmtpSection)ConfigurationManager.GetSection("");我使用了它,但仍然为空。【参考方案4】:
            //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;

【讨论】:

【参考方案5】:

我认为,如果您设置了 defaultCredentials="true",您将拥有 credentials = null,因为您没有使用它们。

调用 .Send 方法时是否发送电子邮件?

所以

这是我的网络配置邮件设置:

<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>

这是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)
);

【讨论】:

不,这不是这里的问题。 OP 正在创建一个新的SmtpSection,而不是从配置中读取它。 Emmh 刚刚看到.. 所以如果你只是调用 SmtpClient smtpClient = new SmtpClient();它应该为您读取 condig 设置,但我几乎可以肯定我还记得默认凭据是真的周围的东西......我会检查它 是的,如果您使用默认凭据,则用户名和密码应该为空。正如 Oded 所说...现在创建一个新凭据...只需实例化您的 SmtpClient 就像 SmtpClient smtpClient = new SmtpClient();并检查设置 好的,因此可以使用配置中的用户名和密码... set.. network defaultCredentials="false"【参考方案6】:

确保您在应用程序中引用了 System.Net

【讨论】:

【参考方案7】:

设置 defaultCredentials="false",因为当它设置为 true 时,不使用任何凭据。

【讨论】:

以上是关于如何从 Web.config 读取 system.net/mailSettings/smtp的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 4中如何读取web.config中的配置

如何从控制台应用程序中读取 web.config 的 <connectionstring>?

如何从 .t​​t 文件(T4 模板)中读取来自 web.config 的 appSetting

如何修改Web.Config里面的值

后台线程读取指定的web.config

读取web.config和app.config配置文件