从中等信任环境中的Web.config读取system.net/mailSettings/smtp

时间:2011-01-05 00:16:05

标签: asp.net asp.net-3.5

我有一些继承的代码,它在Web.config的system.net/mailSettings/smtp部分存储SMTP服务器,用户名和密码。

过去曾经这样读过它们:

Configuration c = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
MailSettingsSectionGroup settings = (MailSettingsSectionGroup)c.GetSectionGroup("system.net/mailSettings");
return settings.Smtp.Network.Host;

但是当我不得不部署到中等信任环境时,这种情况就失败了。

所以按照this question的答案,我重写了它,使用GetSection(),如下:

SmtpSection settings = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");
return settings.Network.Host;

但它仍然在中等信任上给我一个SecurityException,并带有以下消息:

  

请求ConfigurationPermission   尝试访问时失败   配置部分   'system.net/mailSettings/smtp'。至   允许所有呼叫者访问数据   对于本节,设置部分   属性'requirePermission'相等   配置文件中的“false”   声明此部分的地方。

所以我尝试了这个requirePermission属性,但无法确定放在哪里。

如果我将它应用于< smtp>节点,我得到一个ConfigurationError:“无法识别的属性'requirePermission'。请注意,属性名称区分大小写。”

如果我将它应用于< mailSettings>节点,我仍然得到SecurityException。

有没有办法在中等信任下以编程方式获取此配置部分?或者我应该放弃它并将设置移动到< appSettings>?

5 个答案:

答案 0 :(得分:27)

requirePemission属性位于<configSections>分组上,该分组与您遇到安全问题的web.config部分相匹配。

另外,您不必使用代码发送邮件来实际读取设置 - 您只需使用空白的SmtpClient:

 new SmtpClient.Send(MyMailMessage);

默认情况下,它将使用配置部分中的设置发送。

答案 1 :(得分:26)

你可以按照一些建议创建一个SmtpClient,但这有点矫枉过正 - 只需直接阅读这些部分。

var section = ConfigurationManager.GetSection("system.net/mailSettings/smtp") as SmtpSection;
var host=section.Network.Host

答案 2 :(得分:4)

这对我很有用。

var smtp = new System.Net.Mail.SmtpClient();
var host = smtp.Host;
var ssl = smtp.EnableSsl;
var port = smtp.Port;

var credential = new System.Net.Configuration.SmtpSection().Network;
var username = credential.UserName;
var password = credential.Password;

答案 3 :(得分:2)

编码的乐趣......总是有1000种皮肤鱼的方法

System.Net.Configuration.SmtpSection smtp = new System.Net.Configuration.SmtpSection();
string from = smtp.From;
//etc
System.Net.Configuration.SmtpNetworkElement nt = new System.Net.Configuration.SmtpNetworkElement();
string host = nt.Host;
//etc

答案 4 :(得分:2)

要从邮件部分获取设置,只需创建邮件对象。

var client = new SmtpClient();
var messageSettings = new MailMessage();

var host=client.Host;
//etc...

var fromAddress=messageSettings.From.Address;
//etc..

配置:

  <system.net>
    <mailSettings>
      <smtp from="xxxx@yahoo.com" deliveryMethod="Network" >
        <network host="smtp.mail.yahoo.com" port="587" enableSsl="true"
            userName="xxxx@yahoo.com" password="xxxxxxx"/>
      </smtp>     
    </mailSettings>
  </system.net>