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のリンクの例を使用して、次のようなカスタム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が送信できるのと同じ数の受信者を追加できます:)

みんなありがとう

4

5 に答える 5

3

受信者用のcusomconfigセクションを作成してから、このセクションを含める必要があります。カスタムセクションを使用すると、受信者の構成をメインの構成ファイルの外部に保存し、configSource属性を使用して含めることもできます。

まず、こちらをご覧ください:http: //haacked.com/archive/2007/03/11/custom-configuration-sections-in-3-easy-steps.aspx

簡単に言えば、次のことを行う必要があります。

  1. ConfigurationElement(1つの要素の場合)およびConfigurationElementCollection(コレクションの場合はコレクションが必要であり、各受信者が接続の要素になります)から継承して、カスタム構成セクションを実装します。サンプル実装はここで答えです: ConfigurationElementCollectionにカスタム属性を設定する方法は?

  2. mainconfigでconfigセクションを定義します

  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でそれを行う方法の例をいくつか見つけることができます。または、少しグーグルで検索することもできます。

メール受信者を表すために作成するPOCOの場合、セクションのエンティティをある種のエンティティにマップできます。

したがって、作業を簡単にする電子メール受信者のコレクションを操作する必要があります。

また、メールを送信するためのサービスレイヤーを作成することを忘れないでください。

だからここにあなたがしなければならないステップがあります:

  1. カスタム構成セクションを作成します。
  2. メール受信者のPoco表現を作成する
  3. カスタム構成からpocoコレクションにエンティティをマップします
  4. メールを送信するためのサービスまたはシンプルなヘルパーを作成します

ところで、ドメイン/アプリケーション固有のロジックを分離してファイルを分離することをお勧めします。そのため、plzもこのリンクを確認してください。カスタム構成グループを別のファイルに移動する

幸運を!

于 2012-12-18T11:47:14.220 に答える
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値ごとに1つの構成設定を持つことができます。表示名の有無にかかわらず、単一または多数のアドレスで機能します。

于 2012-12-18T12:02:20.593 に答える
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 に答える