我有一些继承的代码,它在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>?
答案 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>