VS2008 WebDeveloper ExpressEditionでMainForm 本文へジャンプ
質問はこちらから→
設定を外部に出す方法
1. さて、今まで、さまざまなメールフォームを作って来ました。
基本をマスターすればアイデア次第でさまざまなメールフォームが作れます。

このシリーズの最後は、今までハードコード(ソースコードに直書き)してきた
送信のためのネットワーク設定や送信先アドレスなどをテキストファイルにして外だしにします。

しかし、単純にテキストファイルに書き出してしまうと、大事な情報が外に漏れてしまう可能性もあります。
そこで、安全に接続情報などを管理できる既存の機能を利用して簡単に設定を外だししていきましょう。

そうです。ここでは、”Web.config”ファイルを使います。

IISでは、Web.configはASP.NETのさまざまな重要な情報を安全に保管するのにつかわれます。
IIS7(Windows7 や Windows Server 2008、2008 R2など)では、さらに安全性が向上しているようです。

では、さっそく、Windows7にIISとASP.NETを入れたPCのIIS設定画面の一部を見てみましょう。

「SMTP電子メール」という項目があります。開いてみましょう。

何やら、そこかで見た設定項目が並んでいます。
そう、これは「画面作成」の回で、”SmtpClient”オブジェクトに設定した項目です。
実は、ここに正しく設定すると、”System.Net.SmtpClient”は送信時の規定値として利用することができるのです。
では、この設定、どこに保管されているのでしょう。

それは、Web.configです。
ただし、サイトに対する設定のみWeb.configに書かれます。
マシンの共通設定は別のところに保管されます。

それでは、Web.configを見てみましょう。

なるほど、こうやって保管されているのか。といった感じですね。
私の場合、Web.configをいじっているので、書かれている場所はみなさんとは違うはずです。

ところで、この設定を利用したとしても、送信先の情報がないですね。
メールアドレスの設定は2つありますが、一つは、SMTPサーバに接続するときのログインユーザ、もう一つは、送信元のメールアドレスです。
送信先はどのように設定するのでしょう?

実は、別途、自分で書き足します。

作法としては、
<configuration>
の次の階層に
<appSettings>
</appSettings>
という階層を設けて、
<configuration>
  <appSettings>
    <add key="〜〜" value="〜〜"/>
    <add key="〜〜" value="〜〜"/>
    ・・・
    <add key="〜〜" value="〜〜"/>
  </appSettings>
と記述するということです。

最低限の項目としては、
宛先の情報だけ書けばよいということになりますが、それだけではさみしいので、いくつかの項目を設定していきましょう。
まず、「件名」、「宛先メールアドレス」、「宛先表示名」、「送信元表示名」、「お礼ページへのURL」といった内容を設定していきましょう。

<configuration>
  <appSettings>
    <add key="件名" value="[メールフォームからの送信]***のページ"/>
    <add key="宛先メールアドレス" value="hoge@hogehoge.hoge"/>
    <add key="宛先表示名" value="管理者表示名"/>
    <add key="送信元表示名" value="送信者表示名"/>
    <add key="お礼ページへのURL" value="http://thanks.hogehoge.hoge"/>
  </appSettings>
2. さて、今度は、この設定値の取り出し方ですね。

基本的に、「SMTP電子メール」設定項目は取り出す必要はないのですが、あえて取り出して”送信者メールアドレス”だけ明示的に設定しましょう。

いつも通り、前回まで使ったメールフォームを利用します。
「MailFormApps」の”Default.aspx”を開いて、「デザイン」ビューで「送信」ボタンをダブルクリックしましょう。
protected void Button1_Click(object sender, EventArgs e)
{
のところに行きましたか?
そこに、
System.Net.Configuration.SmtpSection mySmtpSection = (System.Net.Configuration.SmtpSection)System.Configuration.
ConfigurationManager.GetSection("system.net/mailSettings/smtp");
と一行で書きます。
長すぎると感じる場合は、”Defailt.aspx.cs”の一番上の”using”が並んでいるところに、
using System.Configuration;
using System.Net.Configuration;
と二行書くことで、
SmtpSection mySmtpSection = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");
とusing宣言した部分を省略できます。

これで、”mySmtpSection”オブジェクトにWeb.configの設定が読み込まれます。
あとは、
 mySmtpSection.From
と書けば、Web.configに書かれた”from”の値を持ってきます。

”appSettings”の設定は
System.Configuration.ConfigurationManager.AppSettings["件名"];
などと書くことで持ってこれます。
”"件名"”の部分は”key”の値を書きます。すると、この行全体が”value”の中身と同じに扱えるのです。

もちろん、先の”using”を宣言していれば、
ConfigurationManager.AppSettings["件名"];
とかくことができます。

この記述で、メールメッセージ作成部分を書き直してみましょう。
myMessage.From = new MailAddress(mySmtpSection.From, ConfigurationManager.AppSettings["送信元表示名"]);
myMessage.To.Add(new MailAddress(ConfigurationManager.AppSettings["宛先メールアドレス"], ConfigurationManager.AppSettings["宛先表示名"]));
myMessage.Subject = ConfigurationManager.AppSettings["件名"];
となります。

最後に、「SMTP電子メール」設定項目を使って送信するためにの設定を一行入れます。
myClient.Host = "mail.homehome.com";
myClient.Port = 587;
myClient.Credentials = new System.Net.NetworkCredential("user_name", "pass_word");
の代わりに
myClient.UseDefaultCredentials = true;
と書けば終わりです。

同じように、
Response.Redirect("http://www.hoehoe.com/thanks.html");

Response.Redirect(ConfigurationManager.AppSettings["お礼ページへのURL"]);
と書き換えるのを忘れないようにしましょう。

さて、うまく動きましたか?
3. 宛先を複数指定したい場合、どうすればよいかを最後に示しておきましょう。

簡単に書くので、わかる人だけわかる感じかもしれません。

若干癖があるのですが、 
<configuration>
  <appSettings>
    <add key="件名" value="[メールフォームからの送信]***のページ"/>
    <add key="宛先数" value="3">
    <add key="宛先メールアドレス1" value="hoge@hogehoge.hoge"/>
    <add key="宛先表示名1" value="管理者表示名"/>
    <add key="宛先メールアドレス2" value="hoge2@hogehoge.hoge"/>
    <add key="宛先表示名2" value="管理者表示名2"/>
    <add key="宛先メールアドレス3" value="hoge3@hogehoge.hoge"/>
    <add key="宛先表示名3" value="管理者表示名3"/>
    <add key="送信元表示名" value="送信者表示名"/>
    <add key="お礼ページへのURL" value="http://thanks.hogehoge.hoge"/>
  </appSettings>
という感じで、「宛先数」を追加し、「宛先メールアドレス」と「宛先表示名」のセットを書いていきます。キーの名前は同じではいけないのでルールをつけましょう。
今回は、「それぞれの後ろに1から始まる数字をつける。」とします。
これを、読み取って配列にして一気に流します。
使うのは、
”ConfigurationManager.AppSettings.AllKeys”、”Foreach”です。
まず、2次元配列を宣言します。1次元目はメールアドレスと表示名で2要素、
2次元目は宛先数です。
string[,] mailToArray = new string[2, Convert.ToInt32(ConfigurationManager.AppSettings["宛先数"])];
すべてのAppSettingsのキーを読み取りながら、
「宛先メールアドレス」で始まれば、0を1次元、”添え字-1”を2次元の値にして代入していきます。
「宛先表示名」で始まれば、1を1次元、”添え字-1”を2次元の値にして代入していきます。
foreach (string Str in ConfigurationManager.AppSettings.AllKeys)
{
if (Str.StartsWith("宛先メールアドレス"))
mailToArray[0, Convert.ToInt32(Str.Substring(9)) - 1] = ConfigurationManager.AppSettings[Str];
if (Str.StartsWith("宛先表示名"))
mailToArray[1, Convert.ToInt32(Str.Substring(5)) - 1] = ConfigurationManager.AppSettings[Str];
}
最後に、配列の値をメッセージに入れていきます。
for (int i = 0; i < Convert.ToInt32(ConfigurationManager.AppSettings["宛先数"]); i++)
{
myMessage.To.Add(new MailAddress(mailToArray[0,i], mailToArray[1,i]));
}
4. 実際には、これにエラー検出を書いたりしなければいけないので、非常に複雑になります。
これは、練習用であって、実際にはもっといっぱいエラー訂正だのエラーをイベントログに上げるだのといった記述が必要になります。 
5. 最後までお付き合いありがとうございました。

6回にわたってお届けしたシリーズ、お役にたつ情報は入っていたでしょうか?

ここに来るまで、数限りないサイトを渡り歩き、参考にさせていただきました。
皆様に感謝申し上げます。
どのサイトを参考にしたのか、すでに分からなくなってしまっていますが(^^;

また、こんなに簡単にアプリケーションを作れる環境を提供してくださっているマイクロソフトの方々にも感謝いたします。

みなさまが、いろいろな挑戦をして、素晴らしいソフトを世に出してくださることを祈念して、このシリーズを終わりたいと思います。

もしかしたら、またすぐに別のシリーズを始めるかもしれませんが、それはその時ということで、お疲れ様でした。m(_ _)m
6. ここまでのプロジェクトを用意しました。
参考にされたい方はここからお持ちください。MailFormAppLast.zip へのリンク