我有一个简单的应用程序,可以向我们的一些内部用户发送状态电子邮件。
我使用一个简单的应用程序配置文件(App.config)来存储有关目标用户的电子邮件地址和名称信息。由于appSettings部分似乎只支持简单的键/值对,因此它目前看起来像这样:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="toName" value="Recipient Name" />
<add key="toAddr" value="some@email.com" />
<add key="toName2" value="Another Recipient Name" />
<add key="toAddr2" value="another@email.com" />
<add key="ccName" value="An Archive"/>
<add key="ccAddr" value="copies@email.com"/>
<add key="ccName2" value="Another Archive"/>
<add key="ccAddr2" value="morecopies@email.com"/>
</appSettings>
</configuration>
然后我在代码中单独添加每个收件人。
目前,这意味着每次添加或删除收件人时,我还需要重写代码以处理新收件人并重建和重新部署应用程序
我希望能够存储自定义配置条目,例如:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<recipients>
<recipient recType="to" recAddr="some@email.com" recName="Recipient Name" />
<recipient recType="to" recAddr="another@email.com" recName="Another Recipient Name" />
<recipient recType="cc" recAddr="copies@email.com" recName="An Archive"/>
<recipient recType="cc" recAddr="morecopies@email.com" recName="Another Archive"/>
</recipients>
</configuration>
所以我可以循环使用它们:
MailMessage message = new MailMessage();
foreach(recipient rec in recipients)
{
MailAddress mailAddress = new MailAddress(recipient["recAddr"],recipient["recName"]);
if(recipient["recType"] == "cc")
message.CC.Add(mailAddress);
else
message.To.Add(mailAddress);
}
如何做到这一点?
回答: 使用Regfor链接中的示例,我能够构建一个自定义配置部分,其中包含一组自定义ConfigurationElements:
public class RecipientElement : ConfigurationElement
{
[ConfigurationProperty("name", IsRequired = true, IsKey = true)]
public string Name
{
get
{
return (string)base["name"];
}
}
[ConfigurationProperty("mailAddr", IsRequired = true)]
public string Address
{
get
{
return (string)base["mailAddr"];
}
}
[ConfigurationProperty("isCC")]
public bool IsCC
{
get
{
return (bool)base["isCC"];
}
}
}
使用最终配置部分:
<recipientSection>
<recipients>
<recipient name="Primary recipient" mailAddr="usermailbox@email.com" isCC="false" />
<recipient name="Archive" mailAddr="copies@email.com" isCC="true" />
</recipients>
</recipientSection>
循环浏览recipients
集合可以让我添加尽可能多的收件人,因为SmtpClient会让我发送给:)
谢谢你们
答案 0 :(得分:3)
您应该为您的接收者编写cusom配置部分,然后包含此部分。使用自定义部分,您还可以在主配置文件外部存储接收器配置,并使用configSource属性将其包含在内。
首先你可以看一下: http://haacked.com/archive/2007/03/11/custom-configuration-sections-in-3-easy-steps.aspx
简而言之,你应该:
通过继承 ConfigurationElement (对于一个元素)和 ConfigurationElementCollection 来实现自定义配置部分(对于集合,您需要在您的案例中收集并且每个接收者都将是连接的元素)。示例实现在这里回答: how to have custom attribute in ConfigurationElementCollection?
在主配置中定义配置部分
添加您的自定义配置,它可以作为单独的配置文件包含
答案 1 :(得分:1)
在web.config中创建自定义部分。你可以在http://haacked.com/archive/2007/03/11/custom-configuration-sections-in-3-easy-steps.aspx找到一些如何做到这一点的例子,或者你可以稍微google一下。
如果您要创建用于表示电子邮件接收器的POCO,则可以将部分中的实体映射到某种类型。
因此,您只需操作一系列电子邮件接收器即可轻松完成工作。
并且不要忘记创建用于发送电子邮件的服务层。
所以这是你必须要做的步骤:
顺便说一句,将域/应用程序特定逻辑分离为单独的文件是一个好习惯,因此请仔细查看此链接Moving a custom configuration group to a separate file
祝你好运!答案 2 :(得分:0)
您可以创建自定义配置部分,请查看此处:http://msdn.microsoft.com/en-us/library/2tw134k3(v=vs.100).aspx
用于ASP.NET,我认为也可用于WPF和WinForms。
答案 3 :(得分:0)
您可以将名称/地址值存储在每个邮件寻址的部分中。
<configuration>
<configSections>
<section
name="MailAddressing"
type="System.Configuration.NameValueFileSectionHandler,System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<MailAddressing>
<add key="To" value=""An Example" <someone@example.com>;"Second Example" <another@example.com>" />
<add key="CC" value="someone@example.com" />
<add key="BCC" value="third@example.com" />
<add key="From" value="sender@example.com" />
</MailAddressing>
</configuration>
然后按
访问收件人 NameValueCollection section =
(NameValueCollection)ConfigurationManager.GetSection("MailAddressing");
序列化最简单的解决方案可能是使用MailAddress类中的字符串转换器来处理设置的值。
// Test data
var addressList = new[]
{
new MailAddress("someone@example.com", "An Example"),
new MailAddress("another@example.com", "Second Example")
};
// To String for saving in config
string strValue = addressList.Select(i => i.ToString())
.Aggregate((i, j) => i + ';' + j);
// From String for reading from config
MailAddress[] addressList2 = strValue.Split(';').Select(i =>
new MailAddress(i)).ToArray();
现在,您可以根据邮件寻址对每个To / CC / BCC值进行一次配置设置。无论是否有显示名称,它都可以使用单个地址或多个地址。
答案 4 :(得分:0)
虽然我同意自定义配置部分是一种有效的方法,但可以将多个地址(包括显示名称)放在一个appSetting中。 E.g:
<add key="To"
value='"Recipient Name" <some@email.com>, "Another Recipient Name" <another@email.com>'/>
...
string to = ConfigurationManager.AppSettings["To"];
MailMessage m = new MailMessage();
m.To.Add(to);