5

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

我使用一个简单的应用程序配置文件 (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 链接中的示例,我能够构建一个自定义配置部分,其中包含一组自定义 ConfigurationElement,如下所示:

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 会让我发送到:)

多谢你们

4

5 回答 5

3

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

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

简而言之,您应该:

  1. 通过继承ConfigurationElement(对于一个元素)和ConfigurationElementCollection(对于集合,您需要在您的情况下进行集合,并且每个接收者都是连接元素)来实现您的自定义配置部分。示例实现在这里回答: 如何在 ConfigurationElementCollection 中拥有自定义属性?

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

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

于 2012-12-18T11:47:55.950 回答
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. 创建用于发送电子邮件的服务或简单助手

顺便说一句,将域/应用程序特定的逻辑分离到单独的文件是一个很好的做法,所以请看看这个链接以及将自定义配置组移动到单独的文件

祝你好运!

于 2012-12-18T11:47:14.220 回答
0

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

<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);
于 2012-12-18T13:28:06.650 回答
0

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

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

于 2012-12-18T11:47:57.220 回答
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 值设置一个配置设置。它适用于单个或多个地址,无论是否显示名称。

于 2012-12-18T12:02:20.593 回答