PHPでメール送信

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の使い方は以下の通り.

# apt-get update
# apt-get check
# apt-get dist-upgrade
当然suしてから行う.aptはDebian由来らしいが,Windows Updateみたいで大変便利だ. これでapacheは1.3.23に,postfixは0.0.20010228になった. postfixは少々古いが,1.0系のrpmは依存関係の問題でインストールできなかったのでこれで我慢する. ちなみに,Vine 2.5にaptを当てると2.6になる.

apacheとpostfixが正常に動いていることを確認後,PHPをインストールする. VineのFTPサイトには4.2.3のrpmが置いてあるが,これは依存関係の問題でインストールできなかった. したがって,最新の4.3.3をソースからインストールすることにした.

まず,日本PHPユーザ会からソースアーカイブをダウンロードし, 適当なディレクトリで展開後,出来たディレクトリに移動する.

$ tar xvfz php-4.3.3.tar.gz
$ cd php-4.3.3
次にcofigureするわけであるが,これが鬼門である. 日本語の取り扱いに関するオプションをつけるのを忘れないようにしなければならない. 今回は以下のオプションでconfigureした.
$ ./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する.

$ make
$ su
# make install
install完了後,アーカイブを展開したディレクトリにあるphp.ini-distを/usr/local/lib/php.iniと してコピーする.
# cp php.ini-dist /usr/local/lib/php.ini
/etc/httd/conf/httpd.confに以下の記述があるかを確認する.
<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>
ここで,AddTypeに ".html" を追加する. これで拡張子が .html のファイル中でもPHPスクリプトを実行させることができるようになる.
<IfModule mod_php4.c>
AddType application/x-httpd-php .php4 .php3 .phtml .php .html <--- ".html" を追加する
AddType application/x-httpd-php-source .phps
</IfModule>
あとはapacheを再起動すれば完了である.
# /etc/rc.d/init.d/httpd restart
以下の内容のファイルを作成し(test.phpとする),ブラウザでうまく表示されれば成功である.
<?php
   phpinfo();
?>

さて,実際のコードであるが,日本語メールの送信はmb_send_mailを使うと簡単である. 題名,本文および送信者が記述された通常のメールを送信するならば以下のようにする.

 $sendto = "yamada@aaa.bbb.ccc";
 $subject = "メール題名;
 $body = "メール本文";
 $from = "FROM:" . "tanaka@ddd.eee.fff";
 mb_send_mail( $sendto, $subject, $body, $from);
宛先,題名,本文,送信者の順に指定する. 送信者には "FROM:" を頭に追加する. メール送信に成功すればTRUEが,そうでなければFALSEが返ってくる.

ただし,mb_send_mailを呼び出す前に必ず以下の2行を書いておかなければならない.

 mb_language("Japanese");
 mb_internal_encoding("SJIS") ;
mb_languageは言語を設定するもので,日本語の場合 "Japanese" を指定する. mb_internal_encodingは内部文字エンコードを指定するもので,Shift JISでメールを 書く場合は "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>


お問い合わせはメールにて: akasaka@klc.ac.jp

戻る
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送