关于c#:. NET Application Configuration,用于存储电子邮件联系信息

.NET Application Configuration to store email contact information

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

我使用一个简单的应用程序配置文件(app.config)来存储有关预期用户的电子邮件地址和名称信息。由于AppSettings部分似乎只支持简单的键/值对,因此当前看起来如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 
   
   
   
   
   
   
   
   
  </appSettings>
</configuration>

然后我在代码中分别添加每个收件人。

当前,这意味着每次添加或删除收件人时,我还需要重写代码以处理新收件人,并重新生成和重新部署应用程序。

我希望能够存储自定义配置条目,例如:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <recipients>
    <recipient recType="to" recAddr="[email protected]" recName="Recipient Name" />
    <recipient recType="to" recAddr="[email protected]" recName="Another Recipient Name" />
    <recipient recType="cc" recAddr="[email protected]" recName="An Archive"/>
    <recipient recType="cc" recAddr="[email protected]" recName="Another Archive"/>
  </recipients>
</configuration>

所以我可以通过它们循环:

2

如何做到这一点?

回答:使用regfor链接中的示例,我可以使用如下所示的自定义配置元素集合构建自定义配置部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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"];
        }
    }
}

使用最后的配置部分:

1
2
3
4
5
6
<recipientSection>
  <recipients>
    <recipient name="Primary recipient" mailAddr="[email protected]" isCC="false" />
    <recipient name="Archive" mailAddr="[email protected]" isCC="true" />
  </recipients>
</recipientSection>

循环通过recipients集合,我可以添加SMTPClient允许我发送到的收件人数:)

谢谢大家


您应该为您的接收者编写CUSOM配置部分,然后包括这个部分。使用自定义节,您还可以将recipients配置存储在主配置文件之外,并使用configsource属性将其包含在内。

首先,您可以查看以下内容:http://haacked.com/archive/2007/03/11/custom-configuration-sections-in-3-easy-steps.aspx

简而言之,你应该:

  • 通过继承configurationElement(对于一个元素)和configurationElementCollection(对于集合,在您的情况下需要集合,并且每个接收者都是连接元素)来实现自定义配置部分。下面是示例实现的答案:如何在configurationElementCollection中具有自定义属性?

  • 在主配置中定义配置节

  • 添加您的自定义配置,它可以作为单独的配置文件包含进来。


  • 在中为web.config创建自定义节。您可以在http://haacked.com/archive/2007/03/11/custom-configuration-sections-in-3-easy-steps.aspx中找到一些如何实现这一点的示例,或者您也可以谷歌搜索一下。

    然后,您可以将该部分中的实体映射到您将为表示电子邮件接收者而创建的某种类型的POCO。

    所以你只需要使用一组电子邮件接收器就可以轻松完成你的工作。

    别忘了为发送邮件创建一个服务层。

    所以这里有一个步骤你必须做:

  • 创建自定义配置节。
  • 创建电子邮件收件人的POCO表示
  • 将自定义配置中的实体映射到POCO集合
  • 创建用于发送电子邮件的服务或简单帮助程序
  • 顺便说一句,将特定于域/应用程序的逻辑分隔为单独的文件是一个很好的做法,因此请PLZ查看此链接,并将自定义配置组移动到单独的文件中。

    祝你好运!


    虽然我同意自定义配置节是一种有效的方法,但可以在单个应用程序设置中放置多个地址,包括显示名称。例如.:

    1
    2
    3
    4
    5
    6
    7
    <add key="To"
      value='"Recipient Name" &lt;[email protected]>,"Another Recipient Name" &lt;[email protected]>'/>

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

    您可以在每个邮件寻址部分中存储名称/地址值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <configuration>
      <configSections>
        <section
          name="MailAddressing"
          type="System.Configuration.NameValueFileSectionHandler,System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </configSections>

      <MailAddressing>
         ;&quot;Second Example&quot;" />
         
         
         
      </MailAddressing>
    </configuration>

    然后通过访问地址

    1
    2
        NameValueCollection section =
            (NameValueCollection)ConfigurationManager.GetSection("MailAddressing");

    也许序列化最简单的解决方案是使用mailaddress类中的字符串转换器来处理设置的值。

    2

    现在,每个to/cc/bcc值可以有一个按邮件地址分组的配置设置。它将使用单个地址或多个地址,包括或不包括显示名称。


    您可以创建自定义配置节,请参见:http://msdn.microsoft.com/en-us/library/2tw134k3(v=vs.100).aspx

    适用于ASP.NET,我认为也适用于WPF和WinForms。