Under-Construction
CGIの作り方 > feedback

feedback

最終更新 (2004/01/25)

mailto を改良して、フィードバック専用にしてちょっ と使いやすくしてみました。

ページ下部のアンケートも、この feedback.cgi を使ってます。

機能

mailto から feedback への新機能

mailto 以来の機能


ポイント

短いプログラムなので、下に全リストを示します。

jcode.pl をrequire
漢字コード変換します。GET method の時は enc= 引数が使えて、元の HTML 文書とくっつく文字コードを合わせることができます。メールを送るときは jis コードに直します。
メールの宛て先
@ は必ずエスケープします。
フォーム(くっつき部分)
漢字コードを元文書に合わせます。document.write('') を使ってフォームを出力します。改行コードはなくしておくこと。
応答ページ
メールを送ったあとは、Thank you ページを表示して、送った事実をユーザにフィードバックします。REFERER を頼りに、元のページに自動復帰します。
メール送信
プロバイダで用意されていたインターフェイスを使います。/usr/sbin/sendmail を直接呼んでも良いし、自力で SMTP を喋ってメールを送っても良いです。

ソースリスト

てきとうにコピーしてお使い下さい。無保証です。

#!/usr/bin/perl

use Mail::Sendmail;
require './lib/jcode.pl';

$MAIL_TO = "xxx\@xxx.example.com";
$MAIL_FROM = "xxx\@xxx.example.com";

$addr = $ENV{'REMOTE_ADDR'};
$host = $ENV{'REMOTE_HOST'};
if (($host eq "") || ($host eq $addr)) {
  $ENV{'REMOTE_HOST'} = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
}

foreach $env (keys %ENV){
  $log_all .= "$env = $ENV{$env}\n";
}
$log_all .= "\n";

# PARSE INPUT
if ($ENV{'REQUEST_METHOD'} eq "POST"){
   # POST method の時はメールと thank you message(自動リターン) を表示
  read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
  @pairs = split(/&/, $buf);
  foreach $pair (@pairs){
    ($key, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    &jcode::convert(*value, 'jis');
    $ARG{$key} = $value;
    push(@ARG_LIST, $key);
  }

  $content = <<"CONTENT";

REMOTE_HOST: $ENV{'REMOTE_HOST'}
REMOTE_ADDR: $ENV{'REMOTE_ADDR'}
HTTP_ACCEPT: $ENV{'HTTP_ACCEPT'}
HTTP_USER_AGENT: $ENV{'HTTP_USRE_AGENT'}
HTTP_REFERER: $ENV{'HTTP_REFERER'}

CONTENT

  foreach $item (@ARG_LIST){
    $content .= "$item: $ARG{$item}\n";
  }

  $mail{'Sender'} = $MAIL_FROM;
  $mail{'Subject'} = $ARG{'Subject'} if ($ARG{'Subject'});
  $mail{'To'} = $MAIL_TO;
  $mail{'Body'} = $content;
  $mail{'Content-type'} = "text/plain; charset=ISO-2022-JP";

  sendmail(%mail);

  print "Content-type: text/html;charset=EUC-JP\n\n";
  print <<"HTML";
<html><head>
<title>Thank you for your mail.</title>
<meta http-equiv="Content-Type" content="text/html;charset=EUC_JP">
<meta http-equiv="REFRESH" content="3;URL=$ENV{'HTTP_REFERER'}">
</head>
<body>
<h1>Thank you for your mail.</h1>
<p>
メールの送信をありがとうございました。自動的に元のページに戻ります。
</p>
<p><a href="$ENV{'HTTP_REFERER'}">戻る</a></p>
</body></html>

HTML

  exit;

} else {   # GET method の時はフォームを表示

  $buf = $ENV{'QUERY_STRING'};

  @pairs = split(/&/, $buf);
  foreach $pair (@pairs){
    ($key, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $ARG{$key} = $value;
  }


  if ($ARG{'encode'}){
    if ($ARG{'encode'} eq 'euc_jp'){
      $encode = 'euc';
      $html_charset=';charset=EUC_JP';
    } elsif ($ARG{'encode'} eq 'shift_jis'){
      $encode = 'sjis';
      $html_charset=';charset=Shift_JIS';
    } elsif ($ARG{'encode'} eq 'jis'){
      $encode = 'jis';
      $html_charset=';charset=ISO-2022-JP';
    } else {  # default
      $encode = 'euc';
      $html_charset=';charset=EUC_JP';
    }
  }


  foreach $key (keys %ARG){
    $tmp = $ARG{$key};
    &jcode::convert(*tmp, $encode);
    $ARG{$key} = $tmp;
  }

  $str= <<"HTML";
<form method="POST" action="/~nkon/cgi-bin/feedback.cgi">
<input type="hidden" name="Subject" value="Feedback Form">
<font color="red">この情報があなたの探していたものかどうか、フィードバックの投票をお願いします。</font><br>
<input type="radio" name="check" value="just">just/まさにこれだ! 
<input type="radio" name="check" value="a_little">a little/かすってる! 
<input type="radio" name="check" value="info">info/参考にさせてもらうよ! 
<input type="radio" name="check" value="no">no/違う! 
<br>
<input type="submit" value="Feedback"><br>
どのような情報をお求めですか。感想はいかがですか?<br>
よろしければ、ご自由にご記入下さい。<br>
<textarea name="content" rows=5 cols=80>
</textarea>
HTML

  $str =~ s/\n//g;
  &jcode::convert(*str, $encode);
  print "Content-type: text/plain$html_charset\n\n";
  print "document.write('$str');\n";

  exit;
}

exit;

↓くっついています。Let's View Source


リンクは歓迎です。断りなく、自由に行っていただいてかまいません。


近藤靖浩