.NET Application Configuration用于存储电子邮件联系信息

时间:2012-12-18 11:34:12

标签: c# .net

我有一个简单的应用程序,可以向我们的一些内部用户发送状态电子邮件。

我使用一个简单的应用程序配置文件(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会让我发送给:)

谢谢你们

5 个答案:

答案 0 :(得分:3)

您应该为您的接收者编写cusom配置部分,然后包含此部分。使用自定义部分,您还可以在主配置文件外部存储接收器配置,并使用configSource属性将其包含在内。

首先你可以看一下: http://haacked.com/archive/2007/03/11/custom-configuration-sections-in-3-easy-steps.aspx

简而言之,你应该:

  1. 通过继承 ConfigurationElement (对于一个元素)和 ConfigurationElementCollection 来实现自定义配置部分(对于集合,您需要在您的案例中收集并且每个接收者都将是连接的元素)。示例实现在这里回答: how to have custom attribute in ConfigurationElementCollection?

  2. 在主配置中定义配置部分

         

  3. 添加您的自定义配置,它可以作为单独的配置文件包含

答案 1 :(得分:1)

在web.config中创建自定义部分。你可以在http://haacked.com/archive/2007/03/11/custom-configuration-sections-in-3-easy-steps.aspx找到一些如何做到这一点的例子,或者你可以稍微google一下。

如果您要创建用于表示电子邮件接收器的POCO,则可以将部分中的实体映射到某种类型。

因此,您只需操作一系列电子邮件接收器即可轻松完成工作。

并且不要忘记创建用于发送电子邮件的服务层。

所以这是你必须要做的步骤:

  1. 创建自定义配置部分。
  2. 创建电子邮件收件人的Poco表示
  3. 将实体从自定义配置映射到poco集合
  4. 创建服务或简单帮助以发送电子邮件
  5. 顺便说一句,将域/应用程序特定逻辑分离为单独的文件是一个好习惯,因此请仔细查看此链接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="&quot;An Example&quot; <someone@example.com>;&quot;Second Example&quot; <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" &lt;some@email.com>, "Another Recipient Name" &lt;another@email.com>'/>

...
string to = ConfigurationManager.AppSettings["To"];
MailMessage m = new MailMessage();
m.To.Add(to);