C# 存储电子邮件联系信息的.NET应用程序配置

C# 存储电子邮件联系信息的.NET应用程序配置,c#,.net,C#,.net,我有一个简单的应用程序,可以向一些内部用户发送状态电子邮件 我使用一个简单的应用程序配置文件(App.config)来存储有关预期用户的电子邮件地址和姓名信息。由于appSettings部分似乎只支持简单的键/值对,因此当前看起来如下: <?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="toName" value="Recipient

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

我使用一个简单的应用程序配置文件(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>
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"];
        }
    }
}
如何做到这一点

回答: 使用Regfor链接中的示例,我能够构建一个自定义配置部分,其中包含一组自定义配置元素,如下所示:

<?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>
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允许我发送到的收件人数:)


谢谢大家

在中为web.config创建自定义部分。你可以在这里找到一些例子,或者用谷歌搜索一下

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

因此,你只需要使用一组电子邮件接收者就可以简化你的工作

别忘了创建一个发送电子邮件的服务层

下面是您必须执行的步骤:

  • 创建自定义配置节
  • 创建电子邮件收件人的Poco表示
  • 将实体从自定义配置映射到poco集合
  • 创建用于发送电子邮件的服务或简单助手
  • 顺便说一句,将特定于域/应用程序的逻辑分离为单独的文件是一种很好的做法,因此plz也可以查看此链接


    祝你好运

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

    开始时,您可以查看以下内容:

    简而言之,你应该:

  • 通过继承ConfigurationElement(对于一个元素)和ConfigurationElementCollection(对于集合,您的案例中需要集合,每个recepient都是连接元素)来实现自定义配置节。示例实现如下所示:

  • 在主配置中定义配置部分

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


  • 您可以创建自定义配置节,请参见此处:


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

    您可以将名称/地址值存储在每个邮件地址的一个部分中

    <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>
    
    也许序列化的最简单解决方案是使用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值可以有一个配置设置,并按邮件地址分组。它可以使用单个地址或多个地址,可以使用显示名称,也可以不使用显示名称。

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

    <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);
    
    
    ...
    字符串to=ConfigurationManager.AppSettings[“to”];
    MailMessage m=新的MailMessage();
    m、 加入,加入;
    
    您可以创建一个自定义配置部分,如@StuartDunkeld中所述,非常好,正是我一直在寻找的东西,尽管对于这个(极其简单的)简单来说似乎有点夸张problem@MathiasR.Jessen这似乎有些夸张,因为您使用配置文件的目的并不是设计用来完成的。您尝试破解配置文件所花的时间可能会花在创建自己的简单xml文件上,该文件的设计完全符合您的要求从配置值中,您可以将名称和地址包含在一个值中。另外两个指南链接:或者在这里,configSource已经阅读了3-easy-steps文章,没有太多帮助,我需要一个元素集合(多个收件人),这篇文章一次只处理1个。来自joel abrahamsson的最后一个链接非常有趣,但这只是为了开始理解自定义配置部分的想法。你检查过第二步的链接吗?不是ASP,但我想那是不相关的。但是,我查看了3个简单步骤的解决方案,示例中的自定义配置元素是唯一的,即只有1个BlogSettings元素。我需要存储一个elementsYeah的集合,我试图像您的示例中那样处理NameValueCollection类型,但我仍然面临键/值限制,并且每个条目都有多个属性(名称、地址、收件人/抄送),我想您会喜欢我添加的:)
    <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);