#!/usr/local/bin/perl5 #// 特定キーワードが内容に含まれているメールを受け取ったら #// このスクリプトが稼働中のマシンのIPアドレスを取得し #// そのメールに返信する Ver.1.00.00 #// #// by YOUMEI #// #// 2002/01/10 19:30:00 Ver.1.00.00 #// ひとまず完成 #// 2002/01/21 12:15:00 Ver.1.01.00 #// メールサーバーに繋がらないと #// スクリプトが終了してしまう部分を修正 #// メールサーバーに繋がらない場合の設定追加 #// 2002/01/29 15:40:00 Ver.1.01.01 #// myの記述統一 #// #// ※注意事項 #// ・Perl5以降でご利用ください。 #// ・HTTPサーバーでこのスクリプトを動かすと #//  サーバーの実行時間制限でスクリプトが強制終了します。 #// ・メール本文で判定していますのでSubject:にキーワードを書いても無効です。 #// ・キーワードは正規表現なので日本語とかには変更しないでください(手抜き)。 #//  変更する場合は英数字のみにすると無難です。 #// ・メールやサーバーのアドレスのチェックは行っていないので #//  実際に動作確認をして、チェックしてください(手抜き2)。 use Socket; #//☆ CGIを使用してIPを取得するか? #// 0=NO, 1=Yes $use_cgi=0; #//★ CGIからIPアドレスを取得する場合のアドレスとポート #// http://は不要 $getipcgiurl=''; $httpport='80'; #// #// CGIを使用する場合は下記のものをHTTPサーバーに設置する #// # #!/usr/local/bin/perl # print "Content-Type: text/html\r\n\r\n"; # print $ENV{'REMOTE_ADDR'}; # exit; # #//★ 発信元(送信確認)メールアドレス $MailAddress='youmei@densan.net'; #//★ POP3サーバー設定 #// POP3 サーバー名 $Pop3ServerName='hoge.ne.jp'; #// POP3 ポート $Pop3ServerPort='110'; #// POP3 ユーザー名 $Pop3UserName='qwerty'; #// POP3 ユーザーパスワード $Pop3UserPass='0123456789'; #//★ SMTPサーバー設定 #// SMTP サーバー名 $SmtpServerName='hoge.ne.jp'; #// SMTP ポート $SmtpServerPort='25'; #//★ 返信を行うためのキーワード(正規表現) #// 記号を使うときは\記号でエスケープしてください。 #// 日本語は使えないことがあります。 #// 初期値 : getcurrentip $KeyMessage='getcurrentip'; #//★ メールを確認する間隔(秒) $LoopWaitSec=300; #//☆ メールサーバーに繋がらなかったらスクリプトを終了する #//  1 = 終了する, 0 = 終了しない $ExitServerError=0; #// メイン呼び出し mail_check(); exit; #// メインループ(今のところ永遠にループします) sub mail_check { my ($res, @res_pop3); print ">> ipmailsrv.pl ver.1.01.00 YOUMEI 2001/01/21 12:15:00\r\n\r\n"; do { @res_pop3=check_pop3(); if ( scalar(@res_pop3) > 0 ) { $res=send_smtp(@res_pop3); } else { $res=1; } print ">> Waiting...\r\n"; sleep($LoopWaitSec); } while ($res); } #// メールチェックをしてキーワードにヒットしたら返信するアドレスを抜き出し sub check_pop3 { my ($proto, $ent); my (@mailnum, $num, $tmp, @delnum); my (@replay_address, $flag_reply, $flag_body, $from, $replyto); print ">> Check Mail\r\n"; $proto=getprotobyname('tcp'); socket(SOCK, PF_INET, SOCK_STREAM, $proto); $ent = sockaddr_in($Pop3ServerPort, inet_aton($Pop3ServerName)); eval'connect(SOCK, $ent) || die ">> POP3 Connection Error."'; if ($@ ne '') { close(SOCK); print $@; return $ExitServerError ? 1: @replay_address; } select(SOCK); $| = 1; select(STDOUT); print SOCK "USER $Pop3UserName\r\n"; print SOCK "PASS $Pop3UserPass\r\n"; print SOCK "LIST\r\n"; while() { last if( /^\.\r\n/ ); chomp; if( /^(\d*) (\d*)/ ) { $num=$1; push(@mailnum, $num); } } $replay_address=''; foreach $num (@mailnum) { print SOCK "RETR $num\r\n"; print "RETR $num\r\n"; $flag_reply=$flag_body=0; $from=$replyto=''; while($line=) { last if( $line=~/^\.\r\n/ ); $flag_body=1 if( $line=~/^\r\n/ ); if( $flag_body == 1 ){ if( $line=~/$KeyMessage/ ) { $flag_reply=1; push( @delnum, $num); } } else { if( $line=~/^from: (.*)/i ) { $from=$1; $from=~/([a-zA-Z0-9_\.\-\,]*\@[a-zA-Z0-9_\.\-\,]*)/; $from=$1; } elsif( $line=~/^reply-to: (.*)/i ) { $replyto=$1; $replyto=~/([a-zA-Z0-9_\.\-\,]*\@[a-zA-Z0-9_\.\-\,]*)/; $replyto=$1; } } } if( $flag_reply==1 ) { push (@replay_address, ($replyto ne '')? $replyto:$from); } } foreach $num(@delnum) { print SOCK "DELE $num\r\n"; print "DELE $num\r\n"; } print SOCK "QUIT\r\n"; close(SOCK); return @replay_address; } #// 取得した現在のマシンのIPをメールで送信 sub send_smtp { my @mail_list=@_; my ($proto, $ent); my ($nowip, $mail); print ">> Send Mail\r\n"; if( $use_cgi == 1 ) { $nowip=get_ip( $getipcgiurl, $httpport); } $proto=getprotobyname('tcp'); socket(SOCK, PF_INET, SOCK_STREAM, $proto); $ent = sockaddr_in($SmtpServerPort, inet_aton($SmtpServerName)); eval'connect(SOCK, $ent) || die ">> SMTP Connection Error."'; if ($@ ne '') { close(SOCK); print $@; return $ExitServerError ? 0: 1; } select(SOCK); $| = 1; select(STDOUT); if( $use_cgi==1 ) { print SOCK "HELO $nowip\r\n"; } else { print ">> Get Current IP (SMTP)\r\n"; $nowip=; print SOCK "HELO $SmtpServerName\r\n"; $nowip=; $nowip=~/\[(\d*?\.\d*?\.\d*?\.\d*?)\]/; $nowip=$1; } print SOCK "MAIL FROM: $MailAddress\r\n"; print SOCK "RCPT TO: $MailAddress\r\n"; foreach $mail(@mail_list) { print SOCK "RCPT TO: $mail\r\n"; print "RCPT TO: $mail\r\n"; } print SOCK "DATA\r\n"; print SOCK "From: $MailAddress\r\n"; print SOCK "To: $MailAddress\r\n"; foreach $mail(@mail_list) { print SOCK "Cc: $mail\r\n"; } print SOCK "Subject: Current IP\r\n"; print SOCK "\r\n"; print SOCK "IP = [ $nowip ]\r\n"; print SOCK ".\r\n"; print SOCK "QUIT\r\n"; print ">> IP = [ $nowip ]\r\n"; close(SOCK); return 1; } #// CGIを用いてIP取得 sub get_ip { my ($server, $path, $proto, $ent, $url, $ip, $resultcode); print ">> Get Current IP (CGI)\r\n"; $url=$_[0]; $url=~/([a-zA-Z0-9\-\.]*)(.*)/; $server=$1; $path="/$2"; $path=~s/\/\//\//; $port=$_[1]; $proto=getprotobyname('tcp'); socket(SOCK, PF_INET, SOCK_STREAM, $proto); $ent = sockaddr_in($port, inet_aton($server)); eval'connect(SOCK, $ent) || die ">> HTTP Connection Error."'; if ($@ ne '') { close(SOCK); print $@; return $@; } select(SOCK); $| = 1; select(STDOUT); print SOCK "GET $path HTTP/1.0\r\n"; print SOCK "Host: $server\r\n"; print SOCK "Accept: */*\r\n"; print SOCK "User-Agent: Mozilla/4.5 [ja] (Win98; I)\r\n"; print SOCK "Connection: close\r\n"; print SOCK "\r\n"; $resultcode = ; $resultcode =~ /HTTP\/\d\.\d (\d*)/; $resultcode = $1; if( $resultcode == 200 ) { while() { last if(/^\r\n/); } $ip=; } else { $ip="${resultcode} Server Error!"; } close(SOCK); return $ip; } __END__