メールを受信し,添付ファイルをフォルダに振り分け保存する方法

1 はじめに

 「情報」の授業などで,生徒に制作させた課題のファイルをどのように提出させていますか。ファイルサーバが設置してある学校では,提出用のフォルダにドラッグ&ドロップして,保存させていると思います。しかし,ファイルサーバのない学校では,教員用などのクライアント機の共有フォルダに保存させたり,メールに添付し教科担任のアドレスなどに提出させている学校が多いのではないでしょうか。しかし,メールで提出させた場合,生徒の人数分のメールから添付ファイルを取り出し,特定(生徒個々,学級ごとなど)のフォルダに振り分けて保存するとなるとかなり手間がかかります。そこでここでは,メールの受信から添付ファイルの保存までを一括して行う方法について紹介します。

2 必要な機器,ソフトウェア

機器:Windowsパソコン
OS:Windows98SE,Me,XPなどのクライアント系のOS
ソフトウェア:ActivePerl,BASP21(左記,すべてフリーソフト)

3 ソフトウェアのダウンロードおよびインストール

 今回は,”Perl”という言語を用いて,目的にあったスクリプト(プログラム)を作成します。さらに,スクリプトを容易に作成できるように,”BASP21”というメール送受信などをサポートした汎用コンポーネントを利用します。

 (1) ActivePerlとは

 ActivePerlは,Windows上で動作するPerlインタプリタです。
 Perlは,掲示板のCGIなどWebサーバで利用されることが多い言語ですが,クライアントにおいても通常のプログラミング言語として利用できます。

 (2) ActivePerlのインストール

 ActiveState (http://www.activestate.com/)のWebページを開き,”LANGUAGES”の中の”ActivePerl”をクリックし,開いたページの”Free Download”をクリックします。名前やEmailアドレスなどを記入し,”NEXT”ボタンをクリックすると,ダウンロードページが開きます。
 ここで,Windows 98SEやMeでは(Windows XPでは,必要ありません),Windows Installerが必要になりますので,インストールされていない場合は,”download for 9x/Me”(図1)をクリックし,InstMsiA.exeを適当な場所に保存してインストールします。
 次に,Windows”MSI”(図1)をクリックすると,ActivePerl-5.8.7.813-MSWin32-x86-148120.msi(2005年10月1日時点での最新版)のダウンロードが開始されますので,適当な場所に保存し,ActivePerlをインストールします。インストールについては,規定値のまま特に変更する必要はありません。

図1.ActivePerlのダウロードページ
図1 ActivePerlのダウンロードページ(2005年10月1日時点)

 (3) BASP21とは

 BASP21は,WindowsのVisual BasicやExcelのVBAなどから使える汎用コンポーネントで,Active PerlからはWin32::OLEモジュールを使って利用することができます。
 ここではBASP21の備える多くの機能のうち,”メール受信”,”メール読込み”,”VB互換文字列変換”を利用します。

 (4) BASP21のインストール

 BASP21(http://www.hi-ho.ne.jp/babaq/basp21.html)のWebページを開きます。開いたページの”Down Load! BASP21-2003-0211.exe”をクリックすると,ダウンロードが開始されますので,適当な場所に保存し,BASP21をインストールします。

4 メール受信のためのPerlスクリプトの作成

 ここでは次の要件を満たすスクリプトを作成します。

 テキストエディタで,下記の例を参考にスクリプトを作成し,Perlがインストールされたフォルダ(例 c:\perl)に保存します。このスクリプトのファイル名は適当でかまいませんが,拡張子は”.pl”(例 jusin.pl)にしてください(この後の説明では,jusin.plという名前にします)。
 なお,#で始まる行は,コメント文なので入力しなくてもかまいません。
 (適宜)の部分は,受信するメールアカウントにあわせて,変更します。

Perlスクリプトの例
# 添付ファイルの一括保存
# 言語:Perl
# その他:BASP21(汎用コンポーネント:RcvMail,ReadMail,StrConvを利用)
#

#**********メールアカウント,ファイル保存場所などの設定
$mail_server = '(適宜)';     # POP3サーバ名:利用するアドレスにあわせて設定
$mail_usr = '(適宜)';        # ユーザー名:利用するアドレスにあわせて設定
$mail_pass = '(適宜)';       # パスワード:利用するアドレスにあわせて設定
$mail_command = 'SAVEALLD';    # コマンド:全メールを受信し,POP3サーバから削除
                               #    (サーバに残す場合は,'SAVEALL')
$mail_folder = 'c:\\mail';     # メールの保存用のディレクトリ:適宜変更可能
                               #      注意:\\は2つ必要

#**********OLEパッケージの使用
use Win32::OLE; 

#**********Basp21オブジェクトの作成
$BASP = Win32::OLE -> new('basp21');

#**********メール保存用のディレクトリの作成
mkdir($mail_folder);

#**********メールを受信し保存
$raRcv = $BASP -> RcvMail($mail_server,$mail_usr,$mail_pass,$mail_command,$mail_folder);

#**********メールの読込み,添付ファイルの保存
if (ref($raRcv)) {                      # リファレンスかどうかのチェック
  foreach $sFile (@$raRcv) {
    $raRead = $BASP->ReadMail($sFile, 'subject:',"");   # メールの件名の読み込み
      if(ref($raRead)) {
        # 件名に含まれる全角文字を半角文字に変換
        @$raRead[0] = $BASP->StrConv(@$raRead[0],8);

        # Subject(件名)の初めから半角3文字を”組”
        $kumi = substr(@$raRead[0],9,3);

        # Subject(件名)の4文字目から2文字を”番号”
        $ban = substr(@$raRead[0],12,2);

        # メール保存用の下に組名のディレクトリの作成
        mkdir($mail_folder . "\\" . $kumi);

        # 組名の下に番号名のディレクトリの作成
        $file_folder = $mail_folder . "\\" . $kumi . "\\" . $ban;
        mkdir($file_folder);

        # 添付ファイルを番号名のディレクトリに保存
        $raRead = $BASP->ReadMail($sFile, 'file:',">" . $file_folder);

        }
        else {
          print "ERROR";
        }
    }
    print "完了\n";
}

else {
    print "ERROR: $raRcv\n";
}

#**********メール保存用のディレクトリからメールの削除
unlink glob($mail_folder . "\\*.txt");

 このスクリプトをダウンロードしたい場合は,下記のファイル名を右クリックして,”対象をファイルに保存”を選択します。保存後,受信するメールアカウントにあわせて変更し,ファイルの拡張子を.plにします。
jusin.txt

5 メール受信のためのPerlスクリプトの実行

 (1) コマンドプロンプト(MS-DOSプロンプト)を起動します。

 (2) 上記4で作成したファイルをフルパス(絶対パス)で指定(図2)します。 受信,保存が終了した場合,”完了”と表示されます。メールが届いていないか受信が成功しなかった場合,”ERROR:”と表示されます。

図2.Perlスクリプトの実行例
図2 Perlスクリプトの実行例

 ある生徒が送信したメールの件名が10633の場合,C:\mailの中に,”106”(学級名)のフォルダを作成し,さらにその中に”33”(出席番号)のフォルダを自動的に作成(図3)して,ここに添付ファイルが保存されます。

図3.メールの件名から自動作成されるフォルダ例
図3 メールの件名から自動作成されるフォルダ例

6 Perlスクリプト利用上の注意点

 (1) 同名のファイル

 同名のファイルがフォルダ内に存在するときは,ファイル名(”*****.***”)に,番号が自動的に付加(”*****(n).***”)されるようになっています(BASP21の仕様を利用)。

 (2) メールアカウント

 受信したメールは,メールサーバ(POP3サーバ)から削除する設定になっていますので,メールアカウントは,課題提出専用のものを用意されることをお奨めします。しかし,専用のアカウントが準備できない場合,スクリプトを書き換えて,メールサーバにメールを残す設定にします(訂正箇所は,4のPerlスクリプト例の10行目を$mail_command = 'SAVEALL';に変更します)。

7 活用例

 (1) 生徒ごとのフォルダを作成し保存させたい場合

 Webページの作成に使う写真などをメールに添付し送信するような場合,写真のファイル名では生徒を区別できません。そこで,学級のフォルダの下に,生徒個別のフォルダを自動的に作成させて,そこに添付ファイルを保存させます。

生徒への指示
メールの件名を,学級名(半角英数字3文字)+出席番号(半角英数字2文字)でつけるように指示します。
例えば,1年6組3番の生徒であれば,件名を10603のようにつけさせます(106フォルダの中の03フォルダに添付ファイルが保存されます)。
また,メールの本文は削除されるので,必要なものはすべて添付ファイルにして送信させます。

 (2) 学級のフォルダを作成し保存させたい場合

 授業で作成した制作物のファイルを提出させる場合,学級ごとのフォルダ直下に生徒のファイルが保存されていたほうが採点等の処理を行うときに都合がよいと思います。このようなときには,学級名のフォルダのみが自動的に作成されるようし,そこに添付ファイルを保存させます。

生徒への指示
制作物のファイル名を生徒が特定できるような名前(例えば,ファイル名を生徒番号にする)をつけさせます。メールの件名を,学級名(半角英数字3文字)とします。
例えば,1年6組であれば,106のようにつけさせます(106フォルダの中に添付ファイルが保存されます)。

8 おわりに

 メールを受信して,添付ファイルを自動的に保存するような機能を持ったメールソフトで,フリー(無料)のものが見当たらなかったので,今回のような方法を作成し紹介しました。皆さんに活用いただければ,幸いです。

9 参考