12. メールマガジン

トップどんと来い! ASP.NET > 12. メールマガジン

原理

メールマガジンというものを私は開設したことがありませんが、結構ポピュラーなインターネットシステムです。
ここでは当然「メールマガジンの登録方法」をご紹介するのではなく、メールマガジン登録ソフトの作り方をご紹介します。

一般的なメールマガジンの原理は知りませんが、私が考えたのは非常に簡単です。
登録してもらうごとにそのメールアドレスをテキストファイルに追加していくだけです。

ここで1つ問題があります。テキストファイルが悪質なユーザに読み取られると、非常に大きな損害を被ることになるからです。
それには難しい方法があるかもしれませんが、ここでは2つの方法で対策したいと思います。

1つは「ファイル名の複雑化」です。「mailmagazine.txt」よりも「ctsrhiacrkp.txt」のほうがわかりにくいでしょう。
これは「csharp」と「trick」を混ぜたものです。これ以上に「f637a6b4759ba678ea782dbde152698d.txt」のほうが難しいです。
こっちは「trick」をMD5ハッシュ化したものです。

このように、ファイル名を変えることによってかなりばれにくくなります。
しかし、もう1つのことを怠ると、全く無意味になってしまいます。

それは「default.aspx」をディレクトリ内におかないことによるものです。このファイルがあることで、ディレクトリ内のフォルダ一覧を表示せず、このファイルを表示することになります。
通常のホームページだと「index.html」にあたる働きをします。(WebMatrixHosting ではなくても表示されませんでした)

この2つを守っておけば、かなり安全性が高まることになりますが、個人運営ではなく、何千人単位のメールマガジンを運営する際は他の方法をオススメします。
個人運営、何百人単位の運営ならば心配する必要はありません。

全体像

これまで数多くの実践的な Web アプリケーションのコードに触れてきましたので、今度はもう「どーん」と最初にコードを出しても平気だろうと思います。
私自身もこのメールマガジンプログラムを1時間程度で作ることができ、多少能力があがってきたようです。
<%@ Page Language="C#" %>
<script runat="server">

    // ページのコードをここに記述してください。
    //
    
    void Button1_Click(object sender, EventArgs e) {
        System.IO.StreamReader sr = new System.IO.StreamReader(Server.MapPath(".") + "\\ctsrhiacrkp.txt");
        string adress = sr.ReadToEnd();
        sr.Close();
    
        System.IO.StreamWriter sw = new System.IO.StreamWriter(Server.MapPath(".") + "\\ctsrhiacrkp.txt");
        adress += TextBox1.Text + "\r\n";
        sw.Write("");
        sw.Write(adress);
        sw.Close();
    
        System.IO.StreamWriter sw_count = new System.IO.StreamWriter(Server.MapPath(".") + "\\count.txt");
        int count = int.Parse(Label2.Text);
        count += 1;
        sw_count.Write("");
        sw_count.Write(count);
        sw_count.Close();
    
        Label1.Text = "正常に登録できました";
        Label2.Text = count.ToString();
        TextBox1.Text = "";
    }
    
    void Page_Load(object sender, EventArgs e) {
        if (!IsPostBack)
        {
            System.IO.StreamReader sr_count = new System.IO.StreamReader(Server.MapPath(".") + "\\count.txt");
            Label2.Text = sr_count.ReadToEnd();
            sr_count.Close();
        }
    }
    
    void Button2_Click(object sender, EventArgs e) {
        System.IO.StreamReader sr = new System.IO.StreamReader(Server.MapPath(".") + "\\ctsrhiacrkp.txt");
        string adress = sr.ReadToEnd();
        adress = adress.Replace(TextBox1.Text + "\r\n","");
        sr.Close();
    
        System.IO.StreamWriter sw = new System.IO.StreamWriter(Server.MapPath(".") + "\\ctsrhiacrkp.txt");
        sw.Write("");
        sw.Write(adress);
        sw.Close();
    
        System.IO.StreamWriter sw_count = new System.IO.StreamWriter(Server.MapPath(".") + "\\count.txt");
    
        int count = int.Parse(Label2.Text);
        count -= 1;
        sw_count.Write("");
        sw_count.Write(count);
        sw_count.Close();
    
        Label1.Text = "正常に削除できました";
        Label2.Text = count.ToString();
        TextBox1.Text = "";
    }

</script>
<html>
<head>
</head>
<body bgcolor="#e0e0e0">
    <form runat="server">
        <p>
            『メールマガジン登録・削除フォーム』 
        </p>
        <p>
            メールアドレス:<asp:TextBox id="TextBox1" runat="server" Width="238px"></asp:TextBox>
            &nbsp;<asp:Button id="Button1" onclick="Button1_Click" runat="server" Text="登録"></asp:Button>
            <asp:Button id="Button2" onclick="Button2_Click" runat="server" Text="削除"></asp:Button>
            <br />
            (現在の登録数は <asp:Label id="Label2" runat="server">Label</asp:Label>&nbsp;人です) 
        </p>
        <p>
            <asp:Label id="Label1" runat="server" forecolor="Red"></asp:Label>
        </p>
    </form>
</body>
</html>
ポイントがいくつかあるので、簡単に解説しましょう。

いくつかといっても、探してみると本当に本の少しですね。Button1_Click と Page_Load イベントの中は簡単です。唯一初めて出てくるのは、Button2_Clickの中の以下のステートメントです。
adress = adress.Replace(TextBox1.Text,"");
Replace() メソッドは string に実装された、私の好きな文字列操作のメンバです。

string.Replace("検索文字列", "置換文字列");
ここではメールアドレスを削除するために検索文字列に入力されたメールアドレス と "\r\n" すなわち改行コードを検索し、「無(空文字)」に置換します。

他は難しいところはないでしょう。Replace() は非常に便利なものです。私は文字列処理が好きなので、頻繁に利用します。
ただのサンプル公開みたいになりましたが、後々「ctsrhiacrkp.txt」内のメールアドレスにメールを送る Windows アプリケーションでも作ろうかと考えています。
期待せずに、待たずに、自分で作ってみると能力アップ確実です。Smtp関連を探るといいことあり。では、メルマガソフトはこの辺で。