#! /usr/bin/perl
#
# fmail.cgi
# CAPTCHA付きフォームメール
#
# 1.003 : 12/2/06 : メールチェックを修正
# 1.002 : 11/28/06 : デフォルトをCAPTCHAオフに修正
# 1.001 : 11/23/06 : 受取人メールには送信アドレスを表示するように修正
# 1.0 : 11/21/06 : Initial revision
#
# http://www.hidekik.com
#
# Copyright(c) 2005-2006, Hideki Kanayama All rights reserved
use strict;
use CGI qw(:cgi-lib);
use CGI::Carp qw(fatalsToBrowser);
use File::Basename;
use Jcode;
use GD::SecurityImage::AC;
my $lastupdatedyear = 2006;
my $version = "1.003";
my $script = basename($0);
my $setupfile = "fmail_setup.pl";
my $admindat = "adminpwd.dat";
my $charset = "Shift_JIS";
my $lang = 0;
###########################################
# Enable mail
our $enable_mail = 1;
# Title
our $title = ('フォームメール','Form mail')[$lang];
# Background
our $bgimage_en = 0;
our $bgimage_file = '';
our $bgcolor = "#ffffff";
# Back link
our $backlink_en = 1;
our $backlink = '..';
our $backlink_name = '戻る';
# Body width
our $body_width = '100';
# Display admin link
our $setup_en = 1;
our $setup_name = '管理用';
# return page after sending a mail
# 0: form mail, 1: done page, 2: top page
our $return_page = 0;
# mail command
our $mail_cmd = '/usr/sbin/sendmail -t';
# Recipient
our $to_mail = 'yourname@yourdomain.com';
# Name on To:, From:, Bcc:
# 1: display, 0:no display
our $mail_name = 1;
# body_head
our $body_head = "
フォームメール
";
# body_tail
our $body_tail = '
';
#セキュリティイメージ
our $captcha_en = 0;
our $capimage_width = 230;
our $capimage_height = 80;
our $scramble_en = 1;
our $cap_text_num = 4; #文字数
our $cap_expire = 60; #有効期限(分)
# セキュリティイメージデータディレクトリ
our $capdatadir = 'capdata';
# ttffontファイルを絶対パスで。 "Document and Setting"のようなパス内のspace禁止
our $ttffont = "c:/windows/fonts/cour.ttf";
# ttfrontのポイントサイズ
our $ttffont_ptsize = 30;
# Style Sheet
our $style_sheet_en = 0;
our $style_sheet = '
';
# Head insert
our $head_insert_en = 0;
our $head_insert = '
';
#######################################
require "$setupfile" if (-e "$setupfile");
my $mail_pattern = '(^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,4}$|^$)';
my $q = CGI->new;
my $cgierror = $q->cgi_error;
&error($cgierror) if ($cgierror);
my %in = $q->Vars;
if (! -e "$admindat"){
if ($in{mode} eq 'wradminpwd'){
&wradminpwd($in{pwd},$admindat);
} else {
&setadminpwd($admindat);
}
}
my $captcha;
if ($captcha_en){
$captcha = GD::SecurityImage::AC->new;
$captcha->gdsi(
new => {
width => $capimage_width,
height => $capimage_height,
lines => 10,
scramble => $scramble_en,
font => "$ttffont",
ptsize => $ttffont_ptsize,
},
create => ['ttf', 'rect', '#000000', '#555555'],
particle => [500],
);
if (! -d "$capdatadir") {mkdir $capdatadir;}
$captcha->data_folder($capdatadir);
$captcha->output_folder($capdatadir);
$captcha->expire($cap_expire * 60);
}
if ($in{mode} eq 'setup'){
&setup;
} elsif ($in{mode} eq 'setupwrite'){
&setupwrite;
} elsif ($in{mode} eq 'send'){
&send;
} else {
&mainpage;
}
sub mainpage {
&htmlhead($title);
print $body_head;
print "$backlink_name " if ($backlink_en);
print qq(
\n";
if (! defined $file){
print "管理者用パスワードを入力してください。 \n";
print " \n";
print " \n";
print " \n";
} else {
print "管理者用パスワードを設定してください。 \n";
print " \n";
print " \n";
print " \n";
}
print "
";
print "
";
&htmltail;
exit;
}
sub wradminpwd {
my $plain = shift;
my $file = shift;
$file = "$admindat" unless (defined $file);
my $passwd = &makecrypt($plain);
if (open(FILE,"> $file")){
print FILE "$passwd";
close(FILE);
} else {
&error('パスワードファイル作成に失敗しました');
}
print "Location: $script\n\n";
}
sub checkadmin {
my $pwd = shift;
my $file = shift;
$file = "$admindat" unless (defined $file);
if (open(FILE,"< $file")){
my $filepwd = ;
close(FILE);
my $inpwd = crypt($pwd,$filepwd);
return ("$inpwd" eq "$filepwd");
} else {
&error('パスワードファイルが存在しません');
}
}
sub setup {
my $subname = 'setup';
&setadminpwd if ($in{pwd} eq '');
&error(('管理用パスワードが違います。','Wrong admin password')[$lang]) unless &checkadmin($in{pwd});
&htmlhead($title);
my %check;
$check{backlink}[$backlink_en] = "checked";
$check{bgimage}[$bgimage_en] = "checked";
$check{setup}[$setup_en] = "checked";
$check{style_sheet}[$style_sheet_en] = "checked";
$check{head_insert}[$head_insert_en] = "checked";
$check{return_page}[$return_page] = "checked";
$check{mail_name}[$mail_name] = "checked";
$check{enable_mail}[$enable_mail] = "checked";
my @captcha_check;
my @scramble_check;
$captcha_check[$captcha_en] = "checked";
$scramble_check[$scramble_en] = "checked";
print "\n";
print " \n";
print " \n";
my $notice = ("
セットアップリンクを非表\示にしている場合は、$script?mode=setupからパスワードを入力してこのページに入ってください。
数字やカラー指定は必ず半角で指定してください。全角やブランクだとCGIが起動しなくなります。 万一間違って全角で書いてしまった場合は、$setupfileをエディタで開きその場所を半角に正しく修正してください。それで直ります。 ",
"If you disable to display admin setup link, you can open the page with $script?mode=setup and change the setting. ")[$lang];
print <
メール送信機能\
有効
無効
END
print (('バックグランド','background')[$lang]);
print <
END
print (('画像を使う','image')[$lang]);
print "
";
print (('カラー設定にする','color')[$lang]);
print <
END
print (('画像を使う場合の画像ファイル','image file')[$lang]);
print <
END
print (('カラー設定の場合のカラー番号(白:#ffffff 又は white)','color code(white:white or #ffff)')[$lang]);
print <
END
print (('タイトル名','title')[$lang]);
print <
ブラウザのタイトルバーに表\示されるタイトルです。ページのタイトルは「ページ上部」で自由にタイトル表\示させることができます。
END
print (('トップへのリンク','link to top')[$lang]);
my $disp = ('表示','display')[$lang];
my $nondisp = ('非表示','not display')[$lang];
my $linkname = ('リンク名','link name')[$lang];
print <
$disp
$nondisp
$linkname
URL
END
print (('表示幅','table width')[$lang]);
print "
";
print (('ブラウザ全体の','')[$lang]);
print <%
END
print (('セットアップのリンク','link to setup')[$lang]);
print <
$disp
$nondisp
$linkname
END
print "送信後の戻りページ";
print <
$title
送信完了ページ
「$backlink_name」ページ
END
print (('メールコマンド','Mail command')[$lang]);
print qq( To:などのヘッダ情報が本文に埋め込まれて送信されるのでsendmailの場合は「sendmail -t」のように-tを必ず付けてください。 \n \n);
print " \n";
print <
END
print (('宛先','To address')[$lang]);
print qq( \n \n);
print " \n";
print <
END
print (('From:に名前を表示','Display name on From:')[$lang]);
print " \n\n";
print <$disp
$nondisp
END
print " \n";
print "\n";
print (('<head>内挿入文','sentense in <head>')[$lang]);
my $valid = (('有効','valid')[$lang]);
my $invalid = (('無効','invalid')[$lang]);
print <
$valid
$invalid
END
print (('
HTML書式
ポップアップ広告やJavascript、<META>を挿入したい場合にここに記述する。
以下の記述が<head>〜</head>内に挿入される。
','HTML format. Javascript, popup ads, <META> and so on can be inserted in here.
')[$lang]);
print <$head_insert
セキュリティイメージ設定
有効
無効
画像サイズ:幅 、
高さ
スクランブル
有効
無効
スクランブルを有効にすると文字が散らばるので画像サイズを大きめに設定しないといけません。
文字数
コードの有効期限 分
データディレクトリ
TTFフォントファイル (絶対パス)
"Document and Setting"のようなパス内のspace無効
TTFフォントポイントサイズ
END
my $stylesheetname = ('スタイルシート','style sheet')[$lang];
print <
$stylesheetname
$valid
$invalid
$style_sheet
ページ上部
ページ上部に表\示させるものをHTML表\記
$body_head
ページ下部
ページ下部に表\示させるものをHTML表\記
$body_tail
END
my $setting = (('設定','setting')[$lang]);
print " \n";
print " \n";
&htmltail;
}
sub setupwrite {
&error(('管理人パスワードが違います','Wrong admin password')[$lang]) unless ( &checkadmin($in{pwd}));
foreach (keys(%in)){
$in{$_} =~ s/\s*$//;
}
open(SETUP,"> $setupfile");
print SETUP <