[BACK] 変更履歴に戻る [TXT][DIR] [local] / public_html / Cgi-room へ移動

ファイル: [local] / public_html / Cgi-room / expn.cgi (ダウンロード)
リビジョン 1.4 1970/01/01 (木) 09:00:00 JST (40年7ヵ月前) by
ブランチ: HEAD


#!/usr/local/bin/perl # $Id: expn.cgi,v 1.4 2004/06/12 07:34:47 68user Exp $ $|=1; use strict; use Socket; require 'environment.pl'; my $mail = ""; my $user; my $host; my $is_cgi; my $nslookup = "/usr/sbin/nslookup"; if ( $#ARGV == 0 ){ $mail = $ARGV[0]; $is_cgi = 0; } else { $mail = &parse_args; &put_header("expnしてみよう - $mail -", 'EUC-JP'); print "<center><h1>expnしてみよう - $mail -</h1></center>"; print qq{<center> &lt; <a href="./">戻る</a> &gt; </center><hr>\n}; &add_log($mail); $is_cgi = 1; } if ( $mail eq "" ){ print "メールアドレスを入力してください。"; &finish_work; } if ( $mail !~ /^[a-zA-Z0-9\.\_\-\@]+$/ ){ print "不正なメールアドレスのような気がします"; &finish_work; } if ( $mail =~ /^([a-zA-Z0-9\.\_\-\+]+)\@([a-zA-Z0-9\.\_\-]+)$/ ){ $user = $1; $host = $2; if ( $user eq "" || $host eq "" ){ print "不正なメールアドレスのような気がします"; &finish_work; } } else { print "不正なメールアドレスのような気がします"; &finish_work; } my $port = getservbyname('smtp', 'tcp'); my $iaddr = &get_mx; my $sock_addr = sockaddr_in($port, $iaddr); socket(SERVER, PF_INET, SOCK_STREAM, 0) || &error("ソケットを生成できませんでした。"); connect(SERVER, $sock_addr) || &error("$hostに接続できませんでした。$hostでSMTPサーバが動いていないか、外部からの接続を拒否する設定になっているのでしょう。\n"); select(SERVER); $|=1; select(STDOUT); while (<SERVER>){ if ( m/^220 / ){ last; } } print SERVER "expn $user\n"; my $return = <SERVER>; if ( $return =~ /^250/ ){ print "$mailは存在するメールアドレスです。<p>\n"; print "ただし、この結果はメールサーバの自己申告にすぎません。<br>\n"; print "本気で調べたいなら<a href=\"./#comment-expn\">"; print "詳しい説明</a>を読んで、いろいろなメールアドレスを入力してみてください。<br>\n"; } elsif ( $return =~ /^550/ ){ print "$mailは存在しないメールアドレスです。<p>\n"; print "ただし、この結果はメールサーバの自己申告にすぎません。<br>\n"; print "本気で調べたいなら<a href=\"./#comment-expn\">"; print "詳しい説明</a>を読んで、いろいろなメールアドレスを入力してみてください。<br>\n"; } elsif ( $return =~ /^503/ ){ print "$hostに「お前は誰だ?名をなのれ」と言われました。($return)<br>"; print "そのうち対応します<br>\n"; # print "一応あいさつしてみます。<br>\n"; # print SERVER "helo X68000.startshop.co.jp\n"; # print "返事は ",scalar(<SERVER>),"でした。\n"; # print " } elsif ( $return =~ /^5\d\d/ ){ print "$host は expnを許さない設定になっています。あきらめましょう。<br>\n"; } else { print "よくわからない返事が返ってきました。調べておきます。<br>\n"; } close(SERVER); $is_cgi && &finish_work; exit; #-------------------------------------------------- sub host_error { print "$hostが見つかりません。おそらく存在しないホストです。<br>\n"; &finish_work; } sub error { print "$_[0]"; &finish_work; } #------------------------------------------------- # nslookupを使ってMXレコードを取得。 # sub get_mx { open(NSLOOKUP, "-|") or exec($nslookup, "-type=mx", $host); my $mxhost = undef; while (<NSLOOKUP>){ chomp; if ( /mail exchanger = (.*)$/ ){ $mxhost = $1; last; } } close(NSLOOKUP); if ( ! defined $mxhost ){ &host_error; } $host = $mxhost; print "MXレコードを参照した結果、$hostに接続します。<br><br>\n"; my $iaddr = inet_aton($host) || die &host_error; return $iaddr; } #------------------------------------------------------------ # 引数解析 sub parse_args { my $mail; my @input = split('&', $ENV{'QUERY_STRING'}); foreach (@input){ my ($key, $content) = split('=', $_); foreach (split(/\+/, $content)){ if ( $key eq "mail" ){ tr/+/ /; s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $mail = $_; } } } return $mail; }