Under-Construction
CGIの作り方>Tracer

Tracer

最終更新 (2001/11/18)
私のページの右上に、工事中のアイコンが貼り付けてあります。これは、「Web Pageというものは、常に更新されて、現在工事中の状態が普通」であるという主張とともに、ある機能をもっています。このアイコンは tracer というCGIで表示されており、どのホストから参照されているのかを記録し、ページが表示されるとともに、私にメールを送ります。

ポイント

短いプログラムなので、下に全リストを示します。
メールの宛て先
@ は必ずエスケープします。
イメージ出力のCGI
最初に Content-type: image/gif\n\n ヘッダを送出します。
日付を見やすいように整形する
POSIX モジュールの strftime を使います。
参照先のホスト名を得る方法
環境変数のREMOTE_HOSTに入っているのですが、wakwak は入っていないので、REMOTE_ADDRから gethostbyaddrを使ってホスト名に変換します。
CGIからメールを送る
Mail::Sendmail モジュールを使うのが一番簡単で、トラブルも少ないでしょう。wakwak では/lib/sendmail というプログラムが提供されていますが、これは Mail::Sendmail の単なるラッパです。

ソースリスト

#!/bin/perl

$IMAGE_DATA = "data/tracer.gif";
$MAIL_TO = "xxx\@xxx.example.com";
$LOG_FILE = "data/tracer.log";

$SENDMAIL_PATH="/lib/sendmail";
$MAIL_FROM = "xxx\@xxx.example.com";

print "Content-type: image/gif\n\n";
open(FILE, $IMAGE_DATA);
print ;
close(FILE);

use POSIX qw(strftime);
$log_all = strftime "%a %b %e %H:%M:%S %Y", localtime;
$log_select = strftime "%a %b %e %H:%M:%S %Y", localtime;
$log_all .= "\n";

$addr = $ENV{'REMOTE_ADDR'};
$host = $ENV{'REMOTE_HOST'};
if (($host eq "") || ($host eq $addr)) {
  $ENV{'REMOTE_HOST'} = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
}

foreach $env (keys %ENV){
  $log_all .= "$env = $ENV{$env}\n";
  $log_select .= " $ENV{$env}" if ($env eq "HTTP_REFERER");
  $log_select .= " $ENV{$env}" if ($env eq "HTTP_USER_AGENT");
}
$log_all .= "\n";
$log_select .= "\n";

open(LOG, ">>$LOG_FILE");
print LOG $log_select;
close(LOG);

use Mail::Sendmail;

$mail{'Sender'} = $MAIL_FROM;
$mail{'To'} = $MAIL_TO;
$mail{'Body'} = $log_all;

sendmail(%mail);

リンクは歓迎です。断りなく、自由に行っていただいてかまいません。


近藤靖浩