1. としきのやしき正門
  2. 電算棟
  3. 板塀(掲示板)の手入れ(改造)
  4. レス通知メール

レス通知メール

あちこちに書いていますが、私はここの掲示板を、かつてのTTY時代のニフティのフォーラムの電子会議室のように運用しようと思っております。

さて、ニフティの電子会議室に具備されていた機能で割と便利だと思ったのが、自分の発言にレスポンスがあればその旨をメールで通知してもらえる機能。ニフティではコメント通知メールといっていました。要は、コメントがついたらそれをメールで通知するという、そのまんまのもです。幸いというか、投稿時の入力欄として、メールアドレスの欄も元々用意してあります。もちろん、アドレス非表示という指定であっても、入力さえしておいてもらえればメール通知できます。

WebForumそのものに具備する機能としては、レスがついたら、レス元の発言のメールアドレスにメールを飛ばす、というのが一番基本。ただし、自己レスというか、レスのメールアドレスとレス元のアドレスが同一であればメールは飛ばさない。

実現するにあたり、私が問題点だと思ったのが、掲示板への投稿時にいいかげんなアドレスを登録されてしまった場合。もしその投稿に対して多数のコメントがつくと、そのアドレスに対して多数のメールが飛んでいってしまうのです。
タイトルは「コメントがつきました」くらいにするつもりだし、内容もその程度のものですから、いわゆる広告メールのような使い方はできませんが、発信者名は私の名前になりますから、ただでさえあまりいい評判のない私の信用をますます失墜させるには十分です。

この問題点を解決するために、メールアドレスを事前登録制にすることを考えました。
アドレスリストのデータ形式は、1行1アドレスの単純リスト。
掲示板の側では、コメント元のアドレスが登録済みであればそのアドレスにメールを送るという処理を追加する必要があります。元々、この掲示板システム、なかなかの優れもので、だから使わせていただいているのですが、オリジナルというか、私が入手した生のままで既に掲示板管理人にメールを送るというルーチンがありますので、それにちょっと手を加えれば割と簡単に実装できました。

具体的には、wf_regi.cgiの、管理人へのメール通知の次に追加するような形としました。


    # メール通知
    if ($mailing == 2) { &mail_to; }
    elsif ($mailing == 1 && $in{'email'} ne $mailto) { &mail_to; }

    # レスメール通知
    if ($in{'no'} ne 'new') { #今回の発言が親記事でなければ
        foreach (@lines) {    #親記事を探す
            chop;
            ($no,$reno,$lx,$t,$e,$u,$n,$d,$m,$tm,$h,$a,$w,$OYA,$smail,$res) = split(/<>/);
            if ($no == $in{'no'} && $e ne $in{'email'} ) { #自己レスでなければ
                $opn=open(IN,"./addr_lst.cgi");     # アドレスファイル読み込み
                @addr = <IN>;
                close(IN);
                if ($opn){
                    foreach (@addr) {
                        chop;
                        ($adrs,$password,$stat1,$stat2)=split(/<>/);
                        if ($adrs eq $e && $stat1 eq "登録済") {&com_mail_to;}
                    }
                }
            }
        }
    }

    # 投稿完了

あと、実際にメールを投げるルーチンというのも、管理人宛メールのルーチンとほとんど同じですね。


#---------------------------------------
#  レス通知メール送信
#---------------------------------------
sub com_mail_to {
    local($msub, $mbody, $from);

    # メールタイトル
    $msub = &base64("「やしきの板塀」掲示板でレスポンスがつきました");

    $m_date = &get_mailtime($times);

    # メール本文
    $mbody = <<"EOM";
----------------------------------------------------------------------
「やしきの板塀」(http://toshiki.la.coocan.jp/bbs.html)で、
あなたの発言にレスポンスがつきました。

あなたの発言  $no  $t
レスポンス    $count  $in{'sub'}

※このメールでご案内したレスポンスは、既に削除されていることがあります。
----------------------------------------------------------------------
EOM

    # sendmail起動
    open(MAIL,"| $sendmail -t -i") || &error("メール送信失敗");
    print MAIL "To: \"$n\" <$e>\n";
    print MAIL "From: \"としき@家主\" <$mailto>\n";
    print MAIL "Date: $m_date\n";
    print MAIL "Subject: $msub\n";
    print MAIL "MIME-Version: 1.0\n";
    print MAIL "Reply-To: $mailto\n";
    print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
    print MAIL "Content-Transfer-Encoding: 7bit\n";
    print MAIL "X-Mailer: $ver\n\n";
    foreach ( split(/\n/, $mbody) ) {
        &jcode'convert(*_, 'jis', 'sjis');
        print MAIL $_, "\n";
    }
    close(MAIL);
}

さて、メールアドレスを事前登録制にしても、そこでいいかげんなアドレスを登録されてしまっては困ります。何かよい方法はないかと長いこと考えておりましたが、やっと、解決策の1つを知ることができました。

実は最近、私自身が某所のメールサービスを受けることになりました。
そこでやはり、アドレスの事前登録制を取っていたのです。
方法は実に巧妙というか、わかってしまえば「な〜んだ!」という感じなのですが、それに気づけなかったということで、私自身、やはり頭が固くなっていたようです。

具体的には、以下のようなものです。

  1. WEB上のアドレス登録ページでアドレスを仮登録する
  2. 仮登録されたアドレスにパスワードメールを送信
  3. アドレス登録ページで、送られてきたパスワードを使って本登録する

このようにすると、1つの仮登録アドレスには1回しかメールが送信されませんし、同一のアドレスに対して重複して仮登録できないようにしておけば、ひとつのアドレスに何回もメールが飛んでしまうということは避けられます。
もし誰かがいたずらとか間違いでアドレスを登録したとしても、存在しないアドレスであれば私のところにリターンメールが返ってくるだけです。存在するアドレスであっても、1回しか送られないわけですし、文面に気をつければ、それ程迷惑をかけずに済むのではないかと考えております。

あとは、アドレス登録をどうするか。
お客様は少ないと想定されるので、手作業で行っても何ら問題はありません。
でも、私はスクリプトを使って自動で行う事にしました。が、これは失敗だったかも。例えば、KENTさんのところを見ても、そのものズバリのスクリプトはありませんでした。他のCGI配布サイトをいくつか見ても、こんな単機能なCGI、誰でも作れるからなのかどうか、類似のものすらありません。仕方ないので自分ででっち上げましたが、セキュリティの関係など、かなり自信なし。どこかに具合のよいスクリプトがあればすぐにでも置き換えたいと思っているくらいです。

ということで、メールアドレス登録スクリプトについては非公開とします。
メール等でお問い合わせいただければ、個別に対応させていただきます。


板塀(掲示板)の手入れ(改造)
電算棟
やしきの間取り


Copyright © 2008,2010 としき
このページの情報及び著作権は「としき」に帰属します。
Toshiki / toshiki @ jcom.zaq.ne.jp