「メール自動返信プログラム」のテストプログラムを作成
カテゴリー:Linux
以前、上の2つの記事でメール返信プログラムの作成方法について紹介しました。
今回そのプログラムのテストを行うためのプログラムを作成したので、それについての記事を書きたいと思います。
getmail
今回のプログラムには「メールの内容を受信してチェック」という動作が必要なので、その部分を作成するためにgetmailコマンドを使用しました。
公式サイト
http://pyropus.ca/software/getmail/
彼の野原 - Mail/getmail(インストール方法と基本卯的な使い方に関する日本語の説明あり)
http://kano.feena.jp/?Mail%2Fgetmail
テストプログラムの仕様
testuser@nanbu.comがautoresponse@nanbu.comに空メール送信
autoresponse@nanbu.comが上のメールを受信するとtestuser@nanbu.comに案内メールを送信
という状況をテストするための以下のような動作を行うプログラムを作成しました。
- getmailでtestuser@nanbu.comの現在のメールを~/ReceiveOtherMail.maildata/newに受信
- 空メールをtestuser@nanbu.comからautoresponse@nanbu.comに送信
- ~/ReceiveWelcomeMail.maildata/newの中身を削除
- getmailでtestuser@nanbu.comの新規メールを~/ReceiveWelcomeMail.maildata/newに受信
- ~/ReceiveWelcomeMail.maildata/newにファイルが入っており、そのファイルの内容が案内メールの内容と一致すれば[OK]を出力
テスト用以外のメールがとどいていることを考えて、1で現在のメールを受信して、それを適当なフォルダ(上では~/ReceiveOtherMail.maildata/new)に保存します。その後、2で空メールを送って、4で確認したいメールを~/ReceiveWelcomeMail.maildata/newに保存します3で一度~/ReceiveWelcomeMail.maildata/newディレクトリの中身を削除しているのは、そうすることでファイルが存在すればメールが受信できているということになるので、受信の成功・失敗の確認が簡単になるからです。
テストプログラムのコード例
以下のようなシェルスクリプトファイルを作成しました。
#getmailでtestuser@nanbu.comの現在のメールを~/ReceiveOtherMail.maildata/newに受信
echo "now checking mail....[testuser@nanbu.com]"
getmail --rcfile="/home/testuser/tf/ReceiveOtherMail.getmailrc" -a -l
#空メールをtestuser@nanbu.comからautoresponse@nanbu.comに送信
echo "Mime-Version: 1.0" > tf-thoiku00001.mailstring
echo "Content-Type: Text/Plain; charset=iso-2022-jp" >> tf-thoiku00001.mailstring
echo "Content-Transfer-Encoding: 7bit" >> tf-thoiku00001.mailstring
echo "To: autoresponse@nanbu.com" >> tf-thoiku00001.mailstring
echo "Reply to: testuser@nanbu.com" >> tf-thoiku00001.mailstring
echo "From: testuser@nanbu.com" >> tf-thoiku00001.mailstring
echo "Subject: テストメール" | nkf -M >> tf-thoiku00001.mailstring
echo "X-Mailer: Test driver for xxx mail system" >> tf-thoiku00001.mailstring
echo "" >> tf-thoiku00001.mailstring
echo "本文 てすと body部" | nkf -j >> tf-thoiku00001.mailstring
echo "now sending mail to autoresponse@nanbu.com";
cat tf-thoiku00001.mailstring| mail autoresponse@nanbu.com
#sleep for receiving mail
sleep 3
#getmailでtestuser@nanbu.comの新規メールを~/ReceiveWelcomeMail.maildata/newに受信して内容一致
echo "now checking welcome mail from autoresponse@nanbu.com";
rm /home/thoiku/tf/tf-thoiku00001-ReceiveWelcomeMail.maildata/new/*
getmail --rcfile="/home/testuser/tf/ReceiveWelcomeMail.getmailrc" -n
tail -1 /home/thoiku/tf/tf-thoiku00001-ReceiveWelcomeMail.maildata/new/* | sed 's/http://www.awakko.net/return.php?mail=xxxxxxxxxxx/[OK]/g'
一回目と二回目のgetmailでrcファイルがReceiveOtherMail.getmailrcとReceiveWelcomeMail.getmailrcというふうに違っているのは、上の仕様で書いたように受信ディレクトリの場所を変えるためです。rcファイルの設定内容は受信ディレクトリの設定以外は同じになっています。
携帯の機種ごとのディスプレイサイズをUserAgentから取得
カテゴリー:Web
携帯電話の画面サイズを取得する処理を作る必要がでたので、3つのライブラリを試してみました。
その結果をまとめておきたいと思います。
HTTP::MobileAgentモジュール
CPANで配布されている、携帯機種の情報を取得するためのモジュール
ライセンス
Perl 自体と同じ条件の元,再配布及び/又は修正可能
導入方法
CPANからインストール
perl -MCPAN -e shell
cpan> install HTTP::MobileAgent
画面サイズ取得例
#! /usr/bin/perl
print "Content-type:text/html ";
use HTTP::MobileAgent;
$agent = HTTP::MobileAgent->new($ENV{'HTTP_USER_AGENT'});
my $display = $agent->display;
print "width: ",$display->width,"<br>";
print "height: ",$display->height,"<br>";
実際の結果
DoCoMo SH700iS(240×320ドット)
- widthは液晶のサイズと一致しているがheightが320と252で全く違う値になっていた。
- これはSH700iSの画面サイズは240×320ドットであるが、ブラウザ表示時の画面領域が240×252dotであるため
- 参考:iモードブラウザの画面領域
SoftBank 904SH(640×480ドット)
- width,heightどちらも表示されず
phone.pl
アクセスしてきているブラウザ情報から、携帯電話キャリアや細かな機種情報を自動判別するためのライブラリ。phone.plを設置して呼び出すだけで使用可能。
ライセンス
表記がなかったため問い合わせたところ「商用でもGPLでも、ご自由にお使いいただいて構いません。」とのことでした。
導入方法
phone.plをダウンロード
画面サイズ取得例
#! /usr/bin/perl
print "Content-type:text/html ";
require "phone.pl";
my $phone = &phone_info();
print "width: ",$phone->{width},"<br>";
print "height: ",$phone->{height};
実際の結果
DoCoMo SH700iS(240×320ドット)
- widthは240,heightは表示されず
SoftBank 904SH(640×480ドット)
- width:640,height:480
PEAR:Net_UserAgent_Mobile
Package Information: Net_UserAgent_Mobile
ライセンス
PHP licence
導入方法
- 現在βのため、-fオプションをつけてpearコマンドでインストールする必要がある
pear install -f Net_UserAgent_Mobile
- サーバーに入っているpearのバージョンが 1.4.0 未満のためのエラーだと思われる。
- 参考:http://pear.plus-server.net/faq.html
perlでメール送信する際の文字コード変換について
カテゴリー:Linux
前回の記事で.forwardを使ってメールの自動返信するperlプログラムを実行させる方法を説明しました。
perl内のメール送信部分を作る際に文字コード変換の部分でつまってしまった部分があったので、まとめておきたいと思います。
nkfを利用する方法
最初メール送信部分に以下のようなコードを書いていました。
(変数$fromには送信元アドレス、$toには送信先アドレスが入っている )
open MAIL, "|nkf -j -m0| /usr/sbin/sendmail -f $from -t $to";
print MAIL "From: $from";
print
MAIL "Subject: ようこそ!";
print MAIL "To: $to";
print MAIL "";
print MAIL "ほげほげ";
print MAIL "日本語の本文です。檸檬";
close MAIL;
上のようなコードだと、ターミナルからperlを実行したときには送信できましたが
.forwardからperlを実行したときに、送信できませんでした。
これはperlを実行する環境の違いによってnkfの実行環境が変わっているためだと思います。
そこでnkfを利用せずperl側で変換も行うようにプログラムを作りなおしました。
perlのEncodeモジュールを使用
上のコードではperlのEncodeモジュールを使用しています。
(Encodeモジュールはperl5.8以降で標準モジュール化)
メールのサブジェクトに関しては使用しているサーバのperl5.8.5ではEncodeモジュールで変換できなかったため、あらかじめMIMEエンコーディングしたものを書いています。
use encoding 'utf8';
use Encode ;
open MAIL, "| /usr/sbin/sendmail -f $from -t $to,office@nanbu.com";
print MAIL "From: $from";
print MAIL "Subject:awakko.netへようこそ
";
print MAIL "To: $to";
print MAIL "";
print MAIL Encode::encode ( '7bit-jis' , "日本語のテスト。檸檬");
close MAIL;
なおperl5.8.8以降であればEncodeモジュールはMIMEエンコーディングにも対応しており以下のように書けば変換できるようです。
print MAIL Encode::encode( 'MIME-Header-ISO_2022_JP' ,"Subject: 日本語のタイトル:");
参考サイト
-
http://perldoc.jp/docs/perl/5.8.8/perl588delta.pod
-
http://pmakino.jp/tdiary/20061215.html
-
http://sakaguch.com/utf2.html
メール自動返信プログラム2 perlでの実装
カテゴリー:Linux
前回説明したようにメール転送プログラムである.forwardの設定を行えば、メールを受信したときに他のプログラムを実行するようにできます。前回はそのプログラムにprocmailを実行するように設定したのですが、「相手の送信元のアドレスを記号化(*今回はメール文字列を16進数のアスキーコードに変換)してURLを生成」という部分の実装がprocmailよりperlを利用したほうが短時間で行えそうなのでperlでの実装を行いました。その詳細について記事にしたいと思います。
.forwardの設定
.forwardの設定を変更して、メールを受信したときにperlのプログラムを実行するように変更します。
以下の設定では/home/autoresponseディレクトリにあるreturnmail.plを実行するように設定しています。
"|IFS=' ' && exec /usr/bin/perl /home/autoresponse/returnmail.pl || exit 75 autoresponse"
returnmail.pl
実際のコードを下記に載せておきます。
メールを送信する際にperlのEncodeモジュールを使用しています。
最初、nkfを利用して文字コードを変換して送信するプログラムを作成していましたが、文字化けの問題が起こったためperl側で変換するようにしました。この詳細に関しては次回の記事で書きたいと思います。
#/usr/bin/perl
use encoding 'utf8';
use Encode ;
#.forwardの出力からメールアドレスを取得して、さらに記号化
while (<STDIN>){
$content .= $_;
if ( $1 > 100000 ){ exit; }
if ( m/^From:.*$/ ){
$_ =~ s/From: //g;
$_ =~ s/From: //g;
$_ =~ s/^(.*)<(.*)>(.*)$/$2/g;
$_ =~ s/ //g;
$mailaddress = $_;
$ma16 = unpack("H*",$mailaddress);
}
}
#送信元のアドレスを指定、送信先には上で取得したアドレスを指定
$from = "autoresponse@nanbu.com";
$to = $mailaddress;
#sendmailを利用してメールを送信
open MAIL, "| /usr/sbin/sendmail -f $from -t $to,foo@bar.com";
print MAIL "From: $from ";
print MAIL "Subject:タイトル
";
print MAIL "To: $to ";
print MAIL " ";
print MAIL Encode::encode ( '7bit-jis' , "以下のアドレスを押してください。 ");
print MAIL Encode::encode ( '7bit-jis' , "http://www.foo.com/bar/foo.php?mail=".$ma16." ");
close MAIL;