#!/usr/local/bin/perl
;#----------------------------------------------------------------------
;#                     簡易BBSΘ Version 1.10
;#                           (MiniBBS-ic)
;#
;#                     (c)2001 by CGI-RESCUE
;#                          for Perl5,UNIX
;#                             Free Soft
;#----------------------------------------------------------------S-JIS-
# --[HISTORY]-- ( )内は更新したファイル
# 27/OCT/2001 v1.00 リリース
# 16/DEC/2001 v1.10 icon.cgiの配置場所がindex.htmlと異なる場合の設定変更とアイコン一覧方法の変更(bbs.cgi,icon.cgi)
# ○これはフリーソフトですが、別段に定められる利用規定に従って使用してください。
# ○設置方法等に関することは、添付のREADME.txtをご参照ください。
# ○初心者の方は http://www.rescue.ne.jp/cgi/beginners/ を参照してください。
# --[初期設定]----------------------------------------------------------
# ●画面の設定(背景、文字色、リンク色などの設定)
$body = '
';
# ●ブラウザのタイトルバー等に表示される掲示板の名称
$title_bar = '簡易BBSΘアイコン付き画像掲示板';
# ●掲示板内にリンクする場所と名称
$bye = "http://tasamu.com/ticket";
$bye_name = 'ワールドカップチケット情報';
# ●画面上部に挿入するHTML
#
#  ☆ワンポイントアドバイス☆
#  $head_message = <<'EOF';
#  <この間に記述する> .. 複数行可能です
#  EOF
$head_message = <<'EOF';
ガセ、売買情報はやめてね
EOF
# ●画面下部に挿入するHTML
$end_message = <<'EOF';
使い方
- 最低でも本文または画像添付があれば投稿できます。
- 削除パスワードを入力しないと、投稿者が削除することができなくなります。
- 画像を選択する場合は、そのファイルのパスに半角カナや全角文字および空白を含めると正常に送信できない場合があります。
- 使えるタグは <B>(強調) <I>(斜体) <U>(下線) <FONT>(装飾) のみです。閉じ忘れに注意してください。
- URLまたはメールアドレスと検知された文字列は自動的にリンクされます。
- 本文入力域はソフトラップ(見た目改行)ですので、右端で自動的に折り返したとしても、改行を入力しない場合はその点で改行されません。
- 表示上はブラウザによる自動折り返しを受けます。
- 一定件数に至った場合は一番古い投稿から自動的に削除されます。
EOF
# ●アイコン名の設定
#
# アイコン名は1から順番に1.gif 2.gif … というふうにします。(拡張子は小文字)
# それぞれの画像の名前をこの設定でその数字順に設定します。
# 運用後に入れ替えてしまうと誤動作を起こしますので注意してください。
@ICON = ('大入','かき氷','やかん','電灯','ペンション','鳥居','手を挙げて','ひよこ','おむすび','スイカ');
# ●選択名の設定
#
# 選択させたい名称(都道府県名でも市区町村名でも住所以外の別の目的・表記でもOK)を設定します。
# 運用後に入れ替えてしまうと誤動作を起こしますので注意してください。
@PREF = ('東京','神奈川','埼玉','千葉','栃木','群馬','茨城','山梨','その他');
# ●各ライブラリの設定
#
#  ☆ワンポイントアドバイス☆
#  require '../cgi-bin/jcode.pl'; と require 'jcode.pl'; は意味が違います。
#  もしわからない場合は、このプログラムと同じ場所にjcode.plを設置して、require './jcode.pl'; を設定してください。
require './jcode.pl'; # バージョン2.0以降
require './cgi-lib217.pl'; # バージョン2.17以降
# ●メール処理プログラムの設定
$sendmail = '/usr/sbin/sendmail.org';
# ●管理者の設定
$admin_email = 'ticket@tasamu.com'; # 管理者のメールアドレス
$admin_passwd = '123456789'; # 管理者用パスワード(平文)
# ●1ページの表示件数
$page = 10;
# ●画面の中央寄せ処理(センタリング) 1:する 0:しない
$center = 1;
# ●センタリングする場合の表示域の割合 (センタリングしない場合は自動的に100%となる)
$frame_width = "80%";
# ●投稿者のホスト情報を画面ソース内に含めるかどうかの設定 1:表示する 0:表示しない
$viewhost = 0;
# ●画像投稿を許可するかどうかの設定 1:許可する 0:許可しない
$useimg = 1;
# ●投稿時に管理者にメール連絡するかどうかの設定 1:する 0:しない
$report = 0;
# ●投稿タイトル等の文字色と背景色と内容文背景色の設定
$subject_color = '#ffeedd'; # 文字色
$subject_bgcolor = '#888888'; # 背景色
$textareacolor = '#ffffff'; # 内容文背景色
# ●投稿の間に挿入するHTML
#
#  ☆ワンポイントアドバイス☆
#  投稿タイトル等の文字色と背景色の設定によっては、配色の関係で帯を作らない場合など、投稿と投稿の
#  間に仕切り線を設けたい場合などに使います。例:$HR = '
';
$HR = '';
# ●添付する1画像の上限サイズ(単位:byte)
#
#  ☆ワンポイントアドバイス☆
#  フォームから送信できる文章や添付画像や内部処理用データ等のすべてのデータの合計は、131072バイト(2の17乗)以内でなければ
#  なりませんので、画像についての上限を100000程度に抑えておくことが重要です。(数字にはカンマを含めないこと)
$image_max = 100000;
# ●1投稿に許可する上限文字数(単位:byte) ... 全角1文字は2バイトです
$text_max = 10000;
# ●ローテーション件数 (投稿数がこの数を超えた場合は一番古い投稿から削除されます)
#   この件数を既に超えている状態でこの件数を少なくしても、新たに設定した値は正しく適用されません。
$max_num = 100;
# ●投稿フォームの取り扱い方法
#
#    0: 投稿フォームを表示しない
#    1: 常に投稿フォームを表示する
#    2: 1ページ目にのみ投稿フォームを表示する
$view_form = 2;
# ●投稿データを記録しておく場所(データフォルダ)
#
#  ☆ワンポイントアドバイス☆
#  以下、サーバ内部で扱うパスとWWW上で扱う仮想パス(URL等)を混同しないようにしてください。
#  *_url $icon_dir はindex.htmlから見た仮想パス
#  *_dir *_file はbbs.cgiから見た内部パス
#  (※n)は、説明書の設置構成例に応じた設定例です。
$data_dir = "./data/";
# ●画像データを記録しておく場所(イメージフォルダ)
$images_dir = "./images/";
# ●掲示板の最初のページを示すHTMLファイルの場所(インデックスファイル) ... これは内部パスです
$index_file = "./index.html";
# ●画像データを記録しておく場所を示す仮想パス(イメージURL) ... 分からない場合、仮想パスは http:// から書くといいでしょう
$images_url = "./images/";
# ●アイコンを保存しておく場所(アイコンフォルダ) 仮想パス
$icon_dir = "./icon/";
# ●icon.cgiを設置した場所 .. 仮想パス http://から書いてもよい
$iconcgi = "./icon.cgi";
# ●インデックスファイルにアクセスするための仮想パス(URL)
$base = "http://tasamu.com/ticket/bbs/index.html";
#$base = "http://この掲示板システムのインデックスファイルを設置した場所/"; # ファイル名'index.html'が省略できるサーバであればこれでもよい
# ●このプログラム'bbs.cgi'を設置した場所を示す仮想パス(URL) ... http://この部分を設定する/bbs.cgi
$cgi_base = "http://tasamu.com/ticket/bbs/";
# ●時刻の取得と曜日の表記
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
@wday_array = ('日','月','火','水','木','金','土');
# ●その他の設定
$EXT = ".cgi"; # 投稿データに付ける拡張子
# --[初期設定はここまで]------------------------------------------------
#  以下のプログラムをいじった場合はバグサポートの対象外となります。
#  改造は自由ですが、著作権を放棄しません。改造物の配布については許可が必要です。
# ●システムチェック
if ($jcode'version < 2) { &error('ERROR','バージョン2以降のjcode.plを設置してください.'); }
if ($cgi_lib'version < 2.17) { &error('ERROR','バージョン2.17以降のcgi-lib.plを設置してください.'); }
if ($] < 5) { &error('ERROR','バージョン5以降のPerlで実行してください.'); }
if (!-e $index_file) { &error('ERROR','次の設定が正しくありません - $index_file'); }
if (!-e $images_dir) { &error('ERROR','次の設定が正しくありません - $images_dir'); }
if (!-e $data_dir) { &error('ERROR','次の設定が正しくありません - $data_dir'); }
$copyright = "copyright.gif";
if (!-e "$images_dir$copyright") { &Copyright; } # 簡易BBSのロゴの生成 (この処理を省くと利用規定違反です)
$reload = $cgi_base . "bbs.cgi";
if ($center) { $center1 = ""; $center2 = ""; $frame_width = "width=$frame_width"; }
else { $frame_width = "width=100%"; }
$date_now = sprintf("%01d/%01d(%s) %02d:%02d:%02d",$mon +1,$mday,$wday_array[$wday],$hour,$min,$sec);
$date_num = sprintf("%04d%02d%02d%02d%02d%02d",$year +1900,$mon +1,$mday,$hour,$min,$sec);
# ●ブラウザチェック(画像添付処理ができるかどうか)
$HTTP_USER_AGENT = $ENV{'HTTP_USER_AGENT'};
$HTTP_USER_AGENT =~ s/\(/g; # セキュリティ処理
$HTTP_USER_AGENT =~ s/>/\)/g;
if (!$useimg) { $NO_ENC = 1; }
elsif ($HTTP_USER_AGENT =~ /DreamPassport/) { $NO_ENC = 1; } # ドリームキャスト
elsif ($HTTP_USER_AGENT =~ /iBOX/) { $NO_ENC = 1; } # わくわくステーション
elsif ($HTTP_USER_AGENT =~ /MSIE(.*)4\.5(.*)Mac/) { $NO_ENC = 1; } # バグがあるMAC版IE
elsif ($HTTP_USER_AGENT =~ /Mozilla\/(\d)\./) {
	$Mozilla = $1;
	if ($Mozilla < 3) { $NO_ENC = 1; } # 低いバージョンを念のため除外
}
else { $NO_ENC = 1; } # 分からないものも念のため除外
# ●ホストチェック
$REMOTE_HOST = $ENV{'REMOTE_HOST'};
$REMOTE_ADDR = $ENV{'REMOTE_ADDR'};
if ($REMOTE_HOST eq '') { $REMOTE_HOST = $REMOTE_ADDR; }
if ($REMOTE_HOST eq $REMOTE_ADDR) { $REMOTE_HOST = gethostbyaddr(pack('C4',split(/\./,$REMOTE_HOST)),2) || $REMOTE_ADDR; }
# ●入力
($ret) = &ReadParse;
if (!$ret) { print "Location: $base\n\n"; exit; }
if ($in{'action'} ne "sendmail" && $in{'mailto'} ne "") { &mail_form; }
while (($key,$val) = each %in) { # 初期処理
	if ($key eq "" || $key eq ".") { undef $in{$key}; }
	if ($key eq "attc") { next; } # 画像データを除外
	&jcode'h2z_sjis(*val);
	&jcode'convert(*val,'sjis');
	$val =~ s/\t//g;
	$val =~ s/\r\n/\0/g;
	$val =~ s/\r/\0/g;
	$val =~ s/\n/\0/g;
	$val =~ s/&/&/g;
	$val =~ s/"/"/g;
	$val =~ s/</g;
	$val =~ s/>/>/g;
	$in{$key} = $val;
}
if ($in{'action'} eq "sendmail" && $in{'mailto'} ne "") { # 匿メール(転送メール)
	($ret) = &getMassage("$in{'mailto'}$EXT");
	if (!$ret) { &error("ERROR","投稿が削除されたか、何らかの原因でメール転送ができません."); }
	if ($in{'email'} !~ /\b[-\w.]+@[-\w.]+\.[-\w]+\b/) { &error("入力エラー","メールアドレスの形式が間違っているか、入力されていません.","すべて半角文字で書かれていますか?","画面を戻して修正してください."); }
	if ($in{'value'} eq "") { &error("本文を書いてください","画面を戻してください."); }
	if ($in{'uname'} eq "") { $in{'uname'} = "(未記入)"; }
	if ($in{'title'} eq "") { $in{'title'} = "(無題)"; }
	$in{'value'} =~ s/\0/\n/g;
	$mail_value = "次の掲示板からあなた宛にメールが届きました.\n\n";
	$mail_value .= "掲示板名:$title_bar\n";
	$mail_value .= "設置場所:$base\n\n";
	$mail_value .= "日付:$date_now\n";
	$mail_value .= "タイトル:$in{'title'}\n";
	$mail_value .= "送信者:$in{'uname'}\n";
	if ($in{'email'}) { $mail_value .= "メールアドレス:$in{'email'}$caution\n"; }
	$mail_value .= "\n\n";
	$mail_value .= "---ここから-------------------------------------\n";
	$mail_value .= "$in{'value'}\n";
	$mail_value .= "---ここまで-------------------------------------\n\n";
	&sendmail($MES{'email'},"[FORWARD] $in{'title'}",$mail_value); # &sendmail(送信先,題名,本文);
	&error("送信しました","必ずしも相手に確実に配信することをお約束するものではありません.","画面を閉じてください.");
}
# ●削除
if ($in{'action'} eq "delete") {
	if ($in{'passwd'} eq $admin_passwd) { $ADMIN = 1; } # 管理者チェック
	foreach $filename (split("\0",$in{'quote'})) {
		$remove_ok = 0;
		($ret) = &getMassage("$filename$EXT");
		if (!$ret) { push(@REMOVE_ERR,"No.$filenameは既に削除されています."); next; }
		unless ($ADMIN) { # 削除パスワードチェック
			if ($MES{'passwd'} eq "") { push(@REMOVE_ERR,"No.$filenameは削除パスワードが設定されていません."); next; }
			if ($in{'passwd'} eq $MES{'passwd'}) { $remove_ok = 1; }
		}
		if ($remove_ok || $ADMIN) {
			if (-e "$data_dir$filename$EXT") {
				$chk = unlink "$data_dir$filename$EXT";
				if ($chk) { push(@REMOVE_ERR,"No.$filenameを削除しました."); $access = 1; }
				else { push(@REMOVE_ERR,"No.$filenameの削除に失敗しました."); }
			}
			foreach (split("\0",$MES{'attc_name'})) {
				if (!-e "$images_dir$_") { next; }
				$chk = unlink "$images_dir$_";
				if ($chk) { push(@REMOVE_ERR,"No.$filenameの添付画像$_を削除しました."); }
				else { push(@REMOVE_ERR,"No.$filenameの添付画像$_の削除に失敗しました."); }
			}
		}
		else { push(@REMOVE_ERR,"No.$filenameはパスワードが合わないので削除できませんでした."); }
	}
	if ($access) { # 削除があればインデックスを再生成
		&getList;
		$output = "WRITE";
		if (open($output,"> $index_file")) {
			&putMessage;
			close($output);
		}
	}
	if (@REMOVE_ERR) {
		print "Content-type: text/html\n\n";
		print <<"EOF";
$title_bar
$body
削除処理の実行結果
| EOF
print " ";
foreach $i (0 .. $#REMOVE_ERR) { print "";
print <<"EOF";$REMOVE_ERR[$i]\n"; }
print " | 
EOF
		exit;
	}
}
# ●ファイル出力(インデックスファイルの生成)
if ($in{'action'} eq "regist") {
	if ($in{'attc'}) { ($err_mes) = ®ist2; }
	($ret) = ®ist;
	if (!$ret) { print "Location: $base\n\n"; exit; }
	&getList;
	$output = "WRITE";
	if (open($output,"> $index_file")) {
		&putMessage;
		close($output);
	}
	# クッキーの記録
	($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60); # 30日後
	$y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday";
	$m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec";
	@youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6);
	@monthg = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11);
	$date_gmt = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$youbi[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg);
	if ($in{'cookie'}) {
		if ($in{'uname'} eq "(名前未記入)") { $in{'uname'} = ""; }
		print "Set-Cookie: $ENV{'SCRIPT_NAME'}=cookie:$in{'cookie'}\,uname:$in{'uname'}\,email:$in{'email'}\,tm:$in{'tm'}\,passwd:$in{'passwd'}\,icon:$in{'icon'}\,pref:$in{'pref'}; expires=$date_gmt\n";
		$COOKIE{'uname'} = $in{'uname'};
		$COOKIE{'email'} = $in{'email'};
		$COOKIE{'passwd'} = $in{'passwd'};
		$COOKIE{'tm'} = $in{'tm'};
		$COOKIE{'icon'} = $in{'icon'};
		$COOKIE{'pref'} = $in{'pref'};
		$COOKIE{'cookie'} = $in{'cookie'};
	}
	else {
		$date_gmt = "Sun, 01-Jan-1995 01:00:00 GMT"; # クッキーを完全消去するには正確な過去を設定する(ブラウザを正常に閉じたあとに実行される)
		print "Set-Cookie: $ENV{'SCRIPT_NAME'}=uname:\,email:\,tm:\,passwd:\,icon:\,pref:\,cookie:; expires=$date_gmt\n";
		$COOKIE{'uname'} = $COOKIE{'email'} = $COOKIE{'tm'} = $COOKIE{'passwd'} = $COOKIE{'icon'} = $COOKIE{'pref'} = $COOKIE{'cookie'} = "";
	}
	if ($err_mes) { &getList; $output = "STDOUT"; &putMessage; exit; }
	else { print "Location: $base\n\n"; exit; }
}
else { &getList; }
# ●クッキー入力
@pairs = split(/;/,$ENV{'HTTP_COOKIE'});
foreach $pair (@pairs) {
	($key,$val) = split(/=/,$pair,2);
	$key =~ s/ //g;
	if ($key eq $ENV{'SCRIPT_NAME'}) {
		@pairs = split(/,/,$val);
		foreach $pair (@pairs) {
			($key,$val) = split(/:/,$pair,2);
			$COOKIE{$key} = $val;
		}
		last;
	}
}
# ●画面出力
$output = "STDOUT";
&putMessage;
exit;
sub getList { # ●一覧処理
	$check = (eval { opendir(DIR,$data_dir); }, $@ eq "");
	if (!$check) { &error("ERROR"); }
	$allhits = "";
	@Buf = @NEW = ();
	@BASE = @list = ();
	@lists = readdir(DIR);
	close(DIR);
	foreach $file (@lists) {
		next if $file eq '.';
		next if $file eq '..';
		if ($file =~ /(\d+)$EXT$/) { push(@BASE,$1); }
	}
	@BASE = sort { $b <=> $a; } @BASE;
	if ($in{'vp'} == 0) { $FF = 0; $in{'vp'} = 1; }
	else { $FF = ($in{'vp'} - 1) * $page; }
	$TO = $FF + $page - 1;
	if ($TO > $#BASE) { $TO = $#BASE; }
	$hit = 0;
	$next_num = '';
	foreach $num ($FF .. $#BASE) {
		$filename = $BASE[$num];
		if ($in{'vp'} > 1) {
			$allhits = $in{'allhits'};
			if ($hit == $page) { last; }
			else { push(@NEW,$filename); $hit++; }
		}
		else { # 最初の1ページ目の処理
			if ($hit < $page) { $hit++; push(@NEW,$filename); }
			$allhits++;
		}
	}
	$in{'allhits'} = $allhits;
	push(@Buf,"allhits=$in{'allhits'}");
	$buf = join('&',@Buf);
	$count_new = @NEW;
}
sub regist2 { # 添付画像の記録処理
	if (length($in{'attc'}) > $image_max) { &error("画像ファイル容量オーバー","$image_maxバイト以内のファイルにして送信してください."); }
	$w = 0;
	foreach (@in) {
		($fname) = $_ =~ /\bfilename="([^"]*)"/i;
		($fname) = $_ =~ /\bfilename=([^\s:;]+)/i unless defined $fname;
		if ($fname eq '') { next; }
		($name) = $_ =~ /\bname="([^"]+)"/i;
		($name) = $_ =~ /\bname=([^\s:;]+)/i unless defined $name;
		($ctype) = $_ =~ /\s*Content-type:\s*"([^"]+)"/i;
		($ctype) = $_ =~ /\s*Content-Type:\s*([^\s:;]+)/i unless defined $ctype;
		if ($name =~ /attc/) {
			unless ($ctype =~ /^image/i) { return "画像かどうか確認できませんでした.\n"; }
			if ($ctype eq '') { return "添付されたファイルの形式が判別できませんでした.\n"; }
			$fname = reverse("$fname");
			($fname) = split(/\\|\/|\:/,$fname);
			$fname = reverse("$fname");
			($fname,$ext) = split(/\./,$fname);
			if ($ext =~ /jp(.*)g/i || $ext =~ /gif/i) { ; }
			else { return "拡張子についてJPEGまたはGIFが検出できませんでした.\nファイル名にピリオドは1つだけにしてください.\n"; }
			if (!open(IMAGE,"> $images_dir$date_num\.$w\.$ext")) { return "画像の記録ができませんでした.\n"; }
			print IMAGE $in{$name};
			close(IMAGE);
			chmod(0666,"$images_dir$date_num\.$w\.$ext");
			$in{'attc_name'} .= "\0" if (defined($in{'attc_name'}));
			$in{'attc_name'} .= "$date_num\.$w\.$ext";
		}
		last;
	}
}
sub regist { # 投稿処理
	if ($in{'value'} eq '' && $in{'attc_name'} eq "") { return 0; } # 本文も画像も送信されていない場合は処理しない
	$in{'uname'} =~ s/\;//g; # クッキーに保存できない文字の除去
	$in{'uname'} =~ s/\://g;
	$in{'uname'} =~ s/\/g;
	$in{'uname'} =~ s/\>//g;
	$in{'uname'} =~ s/\,//g;
	$in{'uname'} =~ s/\=//g;
	if ($in{'uname'} eq '') { $in{'uname'} = "(名前未記入)"; }
	if ($in{'uname'} ne '' && length($in{'uname'}) > 30) { $in{'uname'} = substr($in{'uname'},0,30) . " "; $err_mes .= "名前を30バイト以内にカットしました.\n"; }
	if ($in{'email'} ne '' && $in{'email'} !~ /\b[-\w.]+@[-\w.]+\.[-\w]+\b/) { $in{'email'} = ""; $err_mes .= "メールアドレスの形式に誤りがありました.\n"; }
	if ($in{'tm'} && !$in{'email'}) { $in{'tm'} = ""; $err_mes .= "匿メール利用の場合はメールアドレスの入力が必須です.\n"; }
	if ($in{'title'} eq '') { $in{'title'} = "(無題)"; }
	elsif (length($in{'title'}) > 50) { $in{'title'} = substr($in{'title'},0,50) . " "; $err_mes .= "タイトルを50バイト以内にカットしました.\n"; }
	if (length($in{'value'}) > $text_max) { $in{'value'} = substr($in{'value'},0,$text_max) . " "; $err_mes .= "本文を1投稿の上限である$text_maxバイト以内にカットしました.\n"; }
	if ($in{'passwd'} eq "") { $err_mes .= "削除パスワードが設定されませんでしたので管理者しか削除できません.\n"; }
	elsif (length($in{'passwd'}) < 4 || length($in{'passwd'}) > 8) { $in{'passwd'} = ""; $err_mes .= "削除パスワードが規定文字数内でないので削除パスワードは設定しませんでした.\n"; }
	if (!open(DATA,"> $data_dir$date_num$EXT")) { return 0; } # データフォルダへの記録
	print DATA "date\t$date_now\n";
	print DATA "host\t$REMOTE_HOST\n";
	$w = 0;
	while (($key,$val) = each %in) {
		if ($key eq "attc") { next; }
		if ($key eq "action") { next; }
		if ($key eq "form") { next; }
		foreach (split("\0",$val)) { print DATA "$key\t$_\n"; }
	}
	close(DATA);
	chmod(0666,"$data_dir$date_num$EXT");
	if ($report) { # 管理者へのレポート
		$mail_value = "次の掲示板に投稿がありました.\n\n";
		$mail_value .= "掲示板名:$title_bar\n";
		$mail_value .= "設置場所:$base\n\n";
		$mail_value .= "日付:$date_now\n";
		$mail_value .= "タイトル:$in{'title'}\n";
		$mail_value .= "投稿者:$in{'uname'}\n";
		if ($in{'tm'}) { $caution = " (非公開)"; } else { $caution = ""; }
		if ($in{'email'}) { $mail_value .= "メールアドレス:$in{'email'}$caution\n"; }
		$mail_value .= "\n\n";
		$mail_value .= "---ここから-------------------------------------\n";
		foreach (split("\0",$in{'value'})) { $mail_value .= "$_\n"; }
		$mail_value .= "---ここまで-------------------------------------\n\n";
		if ($in{'attc_name'}) { $mail_value .= "○この投稿には画像が投稿されています. ($in{'attc_name'})\n"; }
		&sendmail($admin_email,"[REPORT] $in{'title'}",$mail_value); # &sendmail(送信先,題名,本文);
	}
	# ローテーション
	$check = (eval { opendir(DIR,$data_dir); }, $@ eq "");
	if (!$check) { &error("ERROR"); }
	@rotation2 = readdir(DIR);
	close(DIR);
	foreach $file (@rotation2) {
		next if $file eq '.';
		next if $file eq '..';
		if ($file =~ /(\d+)$EXT$/) { push(@rotation,$1); }
	}
	$now_num = @rotation;
	if ($now_num > $max_num) {
		@rotation = sort { $a <=> $b; } @rotation; # 念のため ^^;
		$filename = $rotation[0];
		($ret) = &getMassage("$filename$EXT");
		if (!$ret) { next; }
		unlink "$data_dir$filename$EXT";
		foreach (split("\0",$MES{'attc_name'})) { unlink "$images_dir$_"; }
	}
	return 1;
}
sub putMessage { # 画面(標準出力)またはインデックスファイル(静的)への出力
if ($output eq "STDOUT") { # 画面への出力(動的)へはクッキーを表示する
	$toku_email_checked{$COOKIE{'tm'}} = "checked";
	$cookie_checked{$COOKIE{'cookie'}} = "checked";
	$read_settei = "";
	print "Content-type: text/html\n\n";
}
else { $read_settei = " (設定の読込み)"; }
print $output <<"EOF";
$title_bar
$body
$center1
EOF
if ($view_form == 1 || ($view_form == 2 && $in{'vp'} == 1) || $in{'form'}) {
	if (!$NO_ENC) { $ENC = ' ENCTYPE="multipart/form-data"'; }
	print $output <<"EOF";
EOF
$view = 1;
}
print $output "
\n";
if ($in{'allhits'}) {
	print $output "【$bye_name】\n";
	print $output "全 $in{'allhits'} 件 [ ";
	$orikaeshi = int($in{'allhits'} / $page / 2);
	$n = $vp = 0;
	for ($jump = $page; $jump < $in{'allhits'} + $page; $jump += $page) { # 各ページへのリンク表示
		$vp++;
		$ffv = ($vp - 1) * $page;
		if ($vp == $in{'vp'}) { print $output " ↑この画面"; $page_now = $vp; $n = 1; }
		elsif ($vp == 1) { print $output " 最初のページ\n"; }
		else {
			if ($n) { $next = "次→"; $n = 0; } else { $next = $vp; }
			print $output " $next\n";
		}
		if ($orikaeshi > 20 && $orikaeshi == $vp) { print $output "
\n"; }
	}
	print $output " ]
\n";
	print $output <<"EOF";
削除する投稿にチェックして削除パスワードを  
[管理者へメール]
EOF
}
print $output <<"EOF";
$center1