さくらのレンタルサーバーであれこれやってます。

Yomi-Searchで認証メールを送る

Yomi-Search FAN!の掲示板で見つけてkazuking searchでも導入しているんですが、Yomi-Search FAN!はご存知の通り・・・。

取り合えずスパム対策に物凄い威力を発揮しているんで記事にしてみます。住さんのアドオンではなかったので問題は無いと思うんですが駄目ならご一報くだされ。改造するのは、regist_ys.cgiと、pl/mail_ys.cgiと2つのファイルの新規作成です。

regist_ys.cgiの383~386行目


  1. ##仮登録モードの場合の設定
  2. if($EST{user_check} && $FORM{changer} ne "admin" && $FORM{mode} eq "act_regist"){
  3. $Slog[14]=join("<1>",$FORM{Fsougo},$FORM{Fadd_kt},$FORM{'Fto_admin'})
  4. }

の下に以下を追加

  1. ##認証パスワード(16)
  2. if($FORM{changer} ne "admin" && $FORM{mode} eq "act_regist" && $FORM{check} ne "on"){
  3. $att_pass = int rand(99999);
  4. $Slog[16]= sprintf("%05d",$att_pass); # (A)16の値はデフォルトの状態。保存ログを追加している場合、最後の値に1プラスした値にする
  5. }

734~736行目

  1. local($new,$new_id,@hyouji_log);
  2. #$new=>追加データ書き込み用/%TASK=>更新するカテゴリリスト
  3. #@hyouji_log=>結果表示用のログデータ

の下に以下を追加

  1. #$att_pass => 認証用パスワード
  2. #$att_id => 認証用ログID
  3. #$att_file => パスワード認証ログ
  4. #$att_days => 認証期間(日数)
  5. $att_pass,$att_id;
  6. $att_file = "att.cgi";
  7. $att_days = "3";

750行目

  1. &check; #入力内容のチェック

を以下に修正

  1. if($FORM{check} ne "on"){
  2. &check; #入力内容のチェック
  3. }

754行目~の

  1. #ID取得&2重URL登録チェック
  2. $Cgane_pre=0; #総登録数
  3. if($EST_reg{nijyu_url}){$new_id=&get_id_url_ch(1);}
  4. else{$new_id=&get_id;}

の下に以下を追加

  1. if($FORM{changer} ne "admin" && $FORM{mode} eq "act_regist" && $FORM{check} ne "on"){
  2. $new_id=&get_checklog_id;
  3. }

759行目

  1. &join_fld($new_id); #入力内容の整形

を以下に修正

  1. if($FORM{check} eq "on"){
  2. if(!$FORM{att_id}){&unlock();&mes("IDが見つかりません","登録認証エラー","java");}
  3. elsif(!$FORM{att_pass}){&unlock();&mes("パスワードが見つかりません","登録認証エラー","java");}
  4. local(@ATT,@CATE,$str);
  5. open(IN,"$EST{log_path}$att_file"); # 仮仮データからログを探す
  6. while(<IN>){
  7. @ATT = split(/<>/,$_);
  8. if($ATT[0] eq $FORM{att_id}){
  9. if($ATT[16] eq $FORM{att_pass}){ # ログを増やしている場合には、ログ番号を変える
  10. @CATE = split(/&/,$ATT[10]);
  11. foreach (1 .. $EST_reg{kt_max}){
  12. $FORM{"Fkt$_"} = $CATE[$_ - 1];
  13. }
  14. pop @ATT;$ATT[0] = $new_id;@Slog = @ATT;$str=1;last;
  15. }
  16. }

  17. close(IN);
  18. if($str ne "1"){&unlock();&mes("無効なIDです。","登録認証エラー","java");} # ログが見つからなかった場合
  19. }
  20. else{
  21. &join_fld($new_id); #入力内容の整形
  22. }

769行目~の

  1. if($EST{user_check} && $FORM{changer} ne "admin" && $FORM{mode} eq "act_regist"){ #<仮登録時>

  2. #仮登録ログデータに追加書き込み

  3. open(OUT,">>$EST{log_path}$EST{temp_logfile}");
  4. print OUT $new;
  5. close(OUT);

を以下に変更

  1. if($EST{user_check} && $FORM{changer} ne "admin" && $FORM{mode} eq "act_regist"){ #<仮登録時>
  2. local(@ATT,@TIME);$times=time();
  3. if($FORM{check} ne "on"){ #<仮仮登録時>
  4. open(IN,"$EST{log_path}$att_file"); # 仮仮データのログを調整
  5. while(<IN>){ # 期間超過分のログを省く
  6. @ATT = split(/<>/,$_);
  7. @TIME=split(/_/,$ATT[11]);
  8. if($TIME[0] > $times - (60*60*24*$att_days)){push(@ATTLOG,$_);}

  9. close(IN);

  10. #仮登録ログデータに追加書き込み

  11. open(OUT,">$EST{log_path}$att_file");
  12. print OUT @ATTLOG;
  13. print OUT $new;
  14. close(OUT);
  15. }
  16. elsif($FORM{check} eq "on"){ #<仮登録時>
  17. open(IN,"$EST{log_path}$att_file"); # 仮仮データのログを調整
  18. while(<IN>){ # 期間超過分のログと、今回のログを省く
  19. @ATT = split(/<>/,$_);
  20. if($ATT[0] ne $FORM{att_id}){
  21. @TIME=split(/_/,$ATT[11]);
  22. if($TIME[0] > $times - (60*60*24*$att_days)){push(@ATTLOG,$_);}
  23. }

  24. close(IN);

  25. #仮仮登録ログデータを更新

  26. open(OUT,">$EST{log_path}$att_file");
  27. print OUT @ATTLOG;
  28. close(OUT);

  29. #仮登録ログデータに追加書き込み

  30. open(OUT,">>$EST{log_path}$EST{temp_logfile}");
  31. print OUT $new;
  32. close(OUT);
  33. }

770行目~の

  1. ##メールを送信
  2. #件名に付けるマークを設定
  3. local($PR_mail_add_line,$PR_mail_sougo,$PR_mail_com,$PR_mail_kt);
  4. &kenmei_put_mark;
  5. sub kenmei_put_mark{
  6. if($FORM{Fsougo}){$PR_mail_sougo="(link)";}
  7. else{$PR_mail_sougo="";}
  8. if($FORM{Fto_admin}){$PR_mail_com="(com)";}
  9. else{$PR_mail_com="";}
  10. if($FORM{Fadd_kt}){$PR_mail_kt="(kt)";}
  11. else{$PR_mail_kt="";}
  12. $PR_mail_add_line=$PR_mail_sougo . $PR_mail_com . $PR_mail_kt;
  13. }
  14. $Slog[6]=~s/<br>/\n/g; $Slog[7]=~s/<br>/\n/g;
  15. if($EST{mail_temp}){require "pl/mail_ys.cgi";}
  16. if($EST{mail_to_admin} && $EST{mail_temp}){ #管理人へメール送信
  17. &mail($EST{admin_email},$Slog[9],"$EST{search_name} 仮登録完了通知$PR_mail_add_line","temp","admin",*Slog,$FORM{Fsougo},$FORM{Fadd_kt},$FORM{Fto_admin});
  18. }
  19. if($EST{mail_to_register} && $EST{mail_temp}){ #登録者へメール送信
  20. &mail($Slog[9],$EST{admin_email},"$EST{search_name} 仮登録完了通知","temp","",*Slog,$FORM{Fsougo},$FORM{Fadd_kt},$FORM{Fto_admin});
  21. }
  22. $Slog[6]=~s/\n/<br>/g; $Slog[7]=~s/\n/<br>/g;

を以下に変更

  1. ##メールを送信
  2. #件名に付けるマークを設定
  3. local($PR_mail_add_line,$PR_mail_sougo,$PR_mail_com,$PR_mail_kt);
  4. if($FORM{check} ne "on"){ # 認証メールを送る場合
  5. if($EST{mail_temp}){require "pl/mail_ys.cgi";}
  6. if($EST{mail_to_register} && $EST{mail_temp}){ #登録者へ認証用メール送信
  7. &mail($Slog[9],$EST{admin_email},"$EST{search_name} 仮登録認証メール","att","",*Slog);
  8. }
  9. }
  10. else{
  11. &kenmei_put_mark;
  12. sub kenmei_put_mark{
  13. if($FORM{Fsougo}){$PR_mail_sougo="(link)";}
  14. else{$PR_mail_sougo="";}
  15. if($FORM{Fto_admin}){$PR_mail_com="(com)";}
  16. else{$PR_mail_com="";}
  17. if($FORM{Fadd_kt}){$PR_mail_kt="(kt)";}
  18. else{$PR_mail_kt="";}
  19. $PR_mail_add_line=$PR_mail_sougo . $PR_mail_com . $PR_mail_kt;
  20. }
  21. $Slog[6]=~s/<br>/\n/g; $Slog[7]=~s/<br>/\n/g;
  22. if($EST{mail_temp}){require "pl/mail_ys.cgi";}
  23. if($EST{mail_to_admin} && $EST{mail_temp}){ #管理人へメール送信
  24. &mail($EST{admin_email},$Slog[9],"$EST{search_name} 仮登録完了通知$PR_mail_add_line","temp","admin",*Slog,$FORM{Fsougo},$FORM{Fadd_kt},$FORM{Fto_admin});
  25. }
  26. if($EST{mail_to_register} && $EST{mail_temp}){ #登録者へメール送信
  27. &mail($Slog[9],$EST{admin_email},"$EST{search_name} 仮登録完了通知","temp","",*Slog,$FORM{Fsougo},$FORM{Fadd_kt},$FORM{Fto_admin});
  28. }
  29. $Slog[6]=~s/\n/<br>/g; $Slog[7]=~s/\n/<br>/g;
  30. }

798行目

  1. require "$EST{temp_path}regist_new_end_temp.html";

を以下に変更

  1. if($FORM{check} ne "on"){
  2. require "$EST{temp_path}regist_new_end_att.html";
  3. }
  4. else{
  5. require "$EST{temp_path}regist_new_end_temp.html";
  6. }

801行目

  1. } #</仮登録時>
  2. else{ #<新規登録時>

  3. #本体ログデータに追加書き込み

  4. open(OUT,">>$EST{log_path}$EST{logfile}");
  5. print OUT $new;
  6. close(OUT);

を以下に修正

  1. } #</仮登録時>
  2. else{ #<新規登録時>
  3. if($FORM{changer} ne "admin" && $FORM{check} ne "on"){
  4. local(@ATT,@TIME);$times=time();
  5. open(IN,"$EST{log_path}$att_file"); # 仮仮データのログを調整
  6. while(<IN>){ # 期間超過分のログを省く
  7. @ATT = split(/<>/,$_);
  8. @TIME=split(/_/,$ATT[11]);
  9. if($TIME[0] > $times - (60*60*24*$att_days)){push(@ATTLOG,$_);}

  10. close(IN);

  11. #仮仮登録ログデータに書き込み

  12. open(OUT,">$EST{log_path}$att_file");
  13. print OUT @ATTLOG;
  14. print OUT $new;
  15. close(OUT);
  16. }
  17. elsif($FORM{changer} ne "admin" && $FORM{check} eq "on"){
  18. local(@ATT,@TIME);$times=time();
  19. open(IN,"$EST{log_path}$att_file"); # 仮仮データのログを調整
  20. while(<IN>){ # 期間超過分のログと登録されるログを省く
  21. @ATT = split(/<>/,$_);
  22. if($ATT[0] ne $FORM{att_id}){
  23. @TIME=split(/_/,$ATT[11]);
  24. if($TIME[0] > $times - (60*60*24*$att_days)){push(@ATTLOG,$_);}
  25. }

  26. close(IN);

  27. #仮仮登録ログデータを更新

  28. open(OUT,">$EST{log_path}$att_file");
  29. print OUT @ATTLOG;
  30. close(OUT);

  31. #本体ログデータに追加書き込み

  32. open(OUT,">>$EST{log_path}$EST{logfile}");
  33. print OUT $new;
  34. close(OUT);
  35. }
  36. else{
  37. #本体ログデータに追加書き込み
  38. open(OUT,">>$EST{log_path}$EST{logfile}");
  39. print OUT $new;
  40. close(OUT);
  41. }

869行目~931行目

  1. ##メールを送信
  2. unless($FORM{FCmail} eq "no" && $FORM{changer} eq "admin"){ #送信する設定なら
  3. #件名に付けるマークを設定
  4. local($PR_mail_sougo,$PR_mail_com,$PR_mail_kt);
  5. &kenmei_put_mark;
  6. $Slog[6]=~s/<br>/\n/g; $Slog[7]=~s/<br>/\n/g;
  7. }

  8. #更新するカテゴリリストを作成

  9.      <<途中省略>>

  10. ##総登録数を記録

  11. open(OUT,">$EST{log_path}total_url.log");
  12. print OUT $Cgane_pre+1;
  13. close(OUT);

  14. &unlock(); #ロック解除


を以下に変更

  1. ##メールを送信
  2. unless($FORM{FCmail} eq "no" && $FORM{changer} eq "admin"){ #送信する設定なら
  3. #件名に付けるマークを設定
  4. local($PR_mail_sougo,$PR_mail_com,$PR_mail_kt);
  5. if($FORM{changer} ne "admin" && $FORM{check} ne "on"){ # 認証メールを送る場合
  6. if($EST{mail_temp}){require "pl/mail_ys.cgi";}
  7. if($EST{mail_to_register} && $EST{mail_temp}){ #登録者へ認証用メール送信
  8. &mail($Slog[9],$EST{admin_email},"$EST{search_name} 本登録認証メール","att","",*Slog);
  9. }
  10. }
  11. else{
  12. &kenmei_put_mark;
  13. $Slog[6]=~s/<br>/\n/g; $Slog[7]=~s/<br>/\n/g;
  14. if($EST{mail_new}){require "pl/mail_ys.cgi";}
  15. if($EST{mail_to_admin} && $EST{mail_new}){ #管理人へメール送信
  16. &mail($EST{admin_email},$Slog[9],"$EST{search_name} 新規登録完了通知$PR_mail_add_line","new","admin",*Slog,$FORM{Fsougo},$FORM{Fadd_kt},$FORM{Fto_admin});
  17. }
  18. if($EST{mail_to_register} && $EST{mail_new}){ #登録者へメール送信
  19. &mail($Slog[9],$EST{admin_email},"$EST{search_name} 新規登録完了通知","new","",*Slog,$FORM{Fsougo},$FORM{Fadd_kt},$FORM{Fto_admin});
  20. }
  21. $Slog[6]=~s/\n/<br>/g; $Slog[7]=~s/\n/<br>/g;
  22. }
  23. }
  24. if($FORM{changer} eq "admin" || $FORM{check} eq "on"){
  25. #更新するカテゴリリストを作成

  26.      <<途中省略>>

  27. ##総登録数を記録

  28. open(OUT,">$EST{log_path}total_url.log");
  29. print OUT $Cgane_pre+1;
  30. close(OUT);
  31. }
  32. &unlock(); #ロック解除

936行目

  1. require "$EST{temp_path}regist_new_end.html";

を以下に変更

  1. if($FORM{changer} ne "admin" && $FORM{check} ne "on"){
  2. require "$EST{temp_path}regist_new_end_att.html";
  3. }
  4. else{
  5. require "$EST{temp_path}regist_new_end.html";
  6. }

973行目

  1. sub get_id{
  2. ##新規登録用のIDを取得
  3. local($id,$line);
  4. if($FORM{changer} ne "admin" && $EST{user_check} && $FORM{mode} eq "act_regist"){ #仮登録モードでユーザの新規登録時
  5. open(IN,"$EST{log_path}$EST{temp_logfile}");
  6. }
  7. else{ #その他
  8. open(IN,"$EST{log_path}$EST{logfile}");
  9. }
  10. while(<IN>){$line=$_; $Cgane_pre++;} 
  11. close(IN);
  12. ($id)=split(/<>/,$line);
  13. return $id+1;
  14. }

の下に以下を追加

  1. sub get_checklog_id{
  2. ##仮仮データ登録用のIDを取得
  3. local($id,$line);
  4. open(IN,"$EST{log_path}$att_file");
  5. while(<IN>){$line=$_;} 
  6. close(IN);
  7. ($id)=split(/<>/,$line);
  8. return $id+1;
  9. }

pl/mail_ys.cgiのデフォルト267行目

  1. #(6)メール送信処理(&mail)

の上に以下を追加

  1. #(5_2)登録認証メール設定(&att_mail)
  2. sub att_mail{
  3. if($EST{user_check}){ # 仮登録設定の場合
  4. $honbun=<<"EOM";
  5. このたびは、$EST{search_name} への仮登録ありがとうございます。
  6. 仮登録を正式に完了させるには、以下のリンクをクリックする必要があります。
  7. なお、登録から$att_days日以内にクリックをしなかった場合は、
  8. 以後クリックしても無効になってしまいます。ご注意ください。

  9. $EST{cgi_path_url}regist_ys.cgi?mode=act_regist&att_id=$log[0]&att_pass=$log[16]&check=on

  10. このメールに覚えがない場合、お手数ですが破棄頂きますようお願します。

  11. +-------------------------------------+

  12. $EST{search_name} 管理人 $EST{admin_name}
  13. HP: $EST{admin_hp}
  14. E-Mail: $EST{admin_email}
  15. +-------------------------------------+

  16. EOM

  17. }
  18. elsif(!$EST{user_check}){ # 仮登録設定でない場合
  19. $honbun=<<"EOM";
  20. このたびは、$EST{search_name} への登録ありがとうございます。
  21. 本登録を正式に完了させるには、以下のリンクをクリックする必要があります。
  22. なお、登録から$att_days日以内にクリックをしなかった場合は、
  23. 以後クリックしても無効になってしまいます。ご注意ください。

  24. $EST{cgi_path_url}regist_ys.cgi?mode=act_regist&att_id=$log[0]&att_pass=$log[16]&check=on

  25. このメールに覚えがない場合、お手数ですが破棄頂きますようお願します。

  26. +-------------------------------------+

  27. $EST{search_name} 管理人 $EST{admin_name}
  28. HP: $EST{admin_hp}
  29. E-Mail: $EST{admin_email}
  30. +-------------------------------------+

  31. EOM

  32. }
  33. }

334行目

  1. elsif($mail_mode eq "any"){&any_mail;}

の下に以下を追加

  1. elsif($mail_mode eq "att"){&att_mail;} # 認証用メール送信

logフォルダに、
att.cgi
を作成(中身は空で良い)

templateフォルダに
regist_new_end_att.html
を作成し、以下のタグを挿入


  1. print<<"<!--HTML-->";
  2. <html>
  3. <head>
  4. <!-- あ -->
  5. <title>新規登録完了</title>
  6. <LINK rel="stylesheet" href="$EST{html_path_url}style.css" type="text/css">
  7. </head>
  8. <body><a name=top></a>
  9. <!-- メニューバー -->
  10. <div align=right><font id=small>
  11. <!--HTML-->
  12. #<!--(↓修正不可↓)
  13. &menu_bar;
  14. # (↑修正不可↑)-->
  15. print<<"<!--HTML-->";
  16. </font></div>
  17. <hr>
  18. <table width="100%"><tr><td id="title-bar">
  19. <b>新規登録完了</b>
  20. </td></tr></table>
  21. <ol>
  22. 登録メールアドレスに認証用メールを送信しました。<br>
  23. <br>
  24. 正常に申\請を完了するには、認証用メールアドレスに記載されている<br>
  25. URLをクリックする必要があります。<br>
  26. <br>
  27. 期間は、$att_days日間となっておりますので、それまでにクリックして下さい。<br>
  28. メールが届かない場合には、登録メールアドレスの入力ミスが考えられます。<br>
  29. 再度、メールアドレスをお確かめの上、登録して下さい。<br>
  30. <br>
  31. <br>
  32. 【 <a href="$EST{home}">ホームに戻る</a> 】
  33. </ol>
  34. <hr>
  35. <!--HTML-->
  36. &cr;
  37. print<<"<!--HTML-->";
  38. </body>
  39. </html>
  40. <!--HTML-->

  41. 1;

長いですがこれで問題ないです。最後のHTMLの部分はYomi-Searchのテンプレートをベースに書かれているんで手直しするところは各自で♪ちなみにこの件で設置できなかった等のコメントなどは受け付けません!私は設置できましたんで(笑)

Trackbacks


Comments - 2 -

はじめまして


スパム登録排除のため導入してみました。ありがとうございます。

設置し、動作はしますが・・・
パスワードと管理人へのメッセージが表示されず、相互リンクの有無は登録時に「相互リンクする」としても仮登録完了画面では「相互リンクしない」になっています。
管理室で見ると「する」になっています。
当方、あまりよくわからないのでどこを弄ればよいのか???です。
kazukingさんのサイトではどうですか?

素晴らしいプログラムをお作り頂いてありがとう御座います。
上のタグをコピーしただけでは一部改行がおかしくなる部分があるので、そこだけ修正した方が良いかと思われます。

Post a comment





Sponsored Link

Link

Web Tool

Banner Link

SEO Stats

デル株式会社 

Right Relation