Sep. 19, 2003
とはいえ,問題用紙を毎回印刷して配り学生に解答させた後回収するのでは面白みに欠けるし,こっちの手間も増える. そこで,問題をweb上で提示し,解答もweb上で行い,メール送信もweb上から行えるようにする.
こういうことをやるんだったらPHPがもってこいである. PHPは文法がCに似ており,Perlよりもとっつきやすい. スクリプト実行時のエラーがHTMLで返されるのでデバッグも容易である. さらに,HTMLに埋め込めるので取り扱いも楽である. Perlは基本的にHTMLとは別のファイルになるため,パーミッションの設定などでハマりやすい(経験済み).
Windwos 2000ベースのサーバでASPを使う手もあるが,新規に2000サーバを導入する予算も無いことから, 廃棄予定だったPentium ProマシンをLinuxを入れてapache+PHPで行くことにした.
LinuxはVine 2.1.5を入れた.
最初は2.5を入れようとしたのであるが,ファイルのコピーが始まったところで落ちてしまうのでやむなく2.1.5にした.
カスタムを選択し,開発ツール,apache,postfixなどをインストールした後,aptコマンドで
最新版にアップデートした.aptの使い方は以下の通り.
当然suしてから行う.aptはDebian由来らしいが,Windows Updateみたいで大変便利だ.
これでapacheは1.3.23に,postfixは0.0.20010228になった.
postfixは少々古いが,1.0系のrpmは依存関係の問題でインストールできなかったのでこれで我慢する.
ちなみに,Vine 2.5にaptを当てると2.6になる.
# apt-get update
# apt-get check
# apt-get dist-upgrade
apacheとpostfixが正常に動いていることを確認後,PHPをインストールする. VineのFTPサイトには4.2.3のrpmが置いてあるが,これは依存関係の問題でインストールできなかった. したがって,最新の4.3.3をソースからインストールすることにした.
まず,日本PHPユーザ会からソースアーカイブをダウンロードし,
適当なディレクトリで展開後,出来たディレクトリに移動する.
次にcofigureするわけであるが,これが鬼門である.
日本語の取り扱いに関するオプションをつけるのを忘れないようにしなければならない.
今回は以下のオプションでconfigureした.
$ tar xvfz php-4.3.3.tar.gz
$ cd php-4.3.3
各オプションの意味は以下の通り.
$ ./configure --with-apxs=/usr/sbin/apxs --enable-mbstring --enable-mbstr-enc-trans --enable-mbrege
--with-apxs=/usr/sbin/apxs | 共有ライブラリ作成用のapache補助ツールapxsの場所を指定する.PHPは apacheのモジュールとして組み込まれる必要があるので,これを忘れてはならない. ディストリビューションによってaxpsがインストールされる場所が異なるので, whereisコマンドで確認したほうがよい. |
--enable-mbstring | マルチバイト処理を行う一連の関数群を有効にする. |
--enable-mbstr-enc-trans | HTTPからの入力を自動的にPHPが使用する内部文字コードに変換する 機能を有効にする. |
--enable-mbrege | マルチバイト対応の正規表現関数を有効にする. |
あとはmakeしてinstallする.
install完了後,アーカイブを展開したディレクトリにあるphp.ini-distを/usr/local/lib/php.iniと
してコピーする.
$ make
$ su
# make install
/etc/httd/conf/httpd.confに以下の記述があるかを確認する.
# cp php.ini-dist /usr/local/lib/php.ini
ここで,AddTypeに ".html" を追加する.
これで拡張子が .html のファイル中でもPHPスクリプトを実行させることができるようになる.
<IfDefine HAVE_PHP4>
LoadModule php4_module modules/libphp4.so
</IfDefine>
<IfDefine HAVE_PHP4>
AddModule mod_php4.c
</IfDefine>
<IfModule mod_php4.c>
AddType application/x-httpd-php .php4 .php3 .phtml .php
AddType application/x-httpd-php-source .phps
</IfModule>
あとはapacheを再起動すれば完了である.
<IfModule mod_php4.c>
AddType application/x-httpd-php .php4 .php3 .phtml .php .html <--- ".html" を追加する
AddType application/x-httpd-php-source .phps
</IfModule>
以下の内容のファイルを作成し(test.phpとする),ブラウザでうまく表示されれば成功である.
# /etc/rc.d/init.d/httpd restart
<?php
phpinfo();
?>
さて,実際のコードであるが,日本語メールの送信はmb_send_mailを使うと簡単である.
題名,本文および送信者が記述された通常のメールを送信するならば以下のようにする.
宛先,題名,本文,送信者の順に指定する.
送信者には "FROM:" を頭に追加する.
メール送信に成功すればTRUEが,そうでなければFALSEが返ってくる.
$sendto = "yamada@aaa.bbb.ccc";
$subject = "メール題名;
$body = "メール本文";
$from = "FROM:" . "tanaka@ddd.eee.fff";
mb_send_mail( $sendto, $subject, $body, $from);
ただし,mb_send_mailを呼び出す前に必ず以下の2行を書いておかなければならない.
mb_languageは言語を設定するもので,日本語の場合 "Japanese" を指定する.
mb_internal_encodingは内部文字エンコードを指定するもので,Shift JISでメールを
書く場合は "SJIS" を指定する.
mb_language("Japanese");
mb_internal_encoding("SJIS") ;
mb_language は必ず書かなければならないが,mb_internal_encoding は書かなくてもうまくいく場合もあるようだ. 今回の場合は書かなければメールが文字化けしてしまったが, Vine 2.6+apache 1.3.27+PHP 4.3.1の組み合わせでは mb_internal_encoding が無くてもうまくいった.
試行錯誤して,以下のような演習問題PHPを作ってみた.
ブラウザで見るとこんな感じだ(送信ボタンを押しても何も起きません).
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=x-sjis">
<title>情報通信技術 第1回演習(2003年10月6日)</title>
</head>
<body>
<center>
<h1>情報通信技術 第1回演習(2003年10月6日)</h1>
<hr>
<form action="mail.php" method="POST">
<!-- 個人情報 //-->
<table border=0>
<tr><td>学籍番号</td> <td><input type = "text"
size = "30"
name = "no" >(半角)</td></tr>
<tr><td>氏名</td> <td><input type = "text"
size = "50"
name = "name" >(全角)</td></tr>
<tr><td>メールアドレス</td><td><input type = "text"
size = "50"
name = "mailaddr" >(半角)</td></tr>
</table>
<p>
<!-- 問題 //-->
<table border=0>
<tr align="left" valign="top" >
<td>1.</td>
<td width = "400" bgcolor="#ffffcc" >
TCP/IPプロトコルを用いたパケット通信のような通信方法を蓄積交換方式と呼ぶ.
一方,電話回線で用いられている通信方法は回線交換方式と呼ばれる.
両者の違いを説明し,それぞれの長所および短所を述べよ.</td>
</tr>
<tr>
<td> </td>
<td>
<textarea name="answer1" cols="55" rows="7"></textarea>
</td>
<tr align="left" valign="top" >
<td>2.</td>
<td width = "400" bgcolor="#ffffcc" >
既存の一般電話回線を用いるADSLはISDNの数十倍の通信速度を安価に実現できるため,
現在急速に普及している.しかしながら,都市部から離れた地域や,都市部であっても
河川の沿岸や大きな工業の近隣などでADSLによる通信が難しい地域が存在する.
この理由を説明せよ.</td>
</tr>
<tr>
<td> </td>
<td>
<textarea name="answer2" cols="55" rows="7"></textarea>
</td>
</tr>
<tr align="left" valign="top" >
<td> </td>
<td>今日の授業の感想</td>
</tr>
<tr>
<td> </td>
<td>
<textarea name="kanso" cols="55" rows="7"></textarea>
</td>
</tr>
</table>
<!-- 送信ボタン //-->
<input type="submit" name="submit" value="送信"> <input type="reset">
</form>
<!-- ここからメール送信処理のPHPプログラム //-->
<?
//グローバル変数
$no = $_POST[ 'no' ];
$name = $_POST[ 'name' ];
$mailaddr = $_POST[ 'mailaddr' ];
$answer1 = $_POST[ 'answer1' ];
$answer2 = $_POST[ 'answer2' ];
$kanso = $_POST[ 'kanso' ];
$submit = $_POST[ 'submit' ];
$my_mailaddr = "hogehoge@aaa.bbb.ccc";
$sendto = $my_mailaddr;
$subject = "情報通信技術演習1" . $no . $name;
$from = "FROM:" . $mailaddr;
$answer = "1" . "\n" . $answer1 . "\n" . "2" . "\n" . $answer2 . "\n感想\n" . $kanso;
// 言語を日本語に設定する
mb_language("Japanese");
mb_internal_encoding("SJIS") ;
//空欄がなければメール送信許可
if( $submit == "送信" ){
if ( (! empty($no) ) and ( ! empty($name) ) and ( ! empty($mailaddr) ) ) {
if ( mb_send_mail( $sendto, $subject, $answer, $from) ) {
print "お疲れさまでした.あなたの解答は " . $my_mailaddr . " 宛に送信されました.";
} else {
print "メール送信に失敗しました.";
}
}
else {
print "すべてに入力後,[送信]ボタンを押してください.";
}
}
?>
</center>
</body>
</html>
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||