メールアドレスの正当性チェックを実行する
Net::DNSを使用した実装例です。
Email::Validを使用すると可能なのですが、リトライする、レコードなしはNGだが、タイムアウトなどのエラーはとりあえずOKとするなど、柔軟性がほしかったので作ってみたもの。でもよく考えたら、ここに載せなくても、Email::Validのソースをみたらいつでもよいサンプルになるのかもしれません。
use Email::Valid::Loose; use Net::DNS::Resolver; # メールアドレスのチェック関数 sub check_mail { my $valid = new Email::Valid::Loose; my $resolver = new Net::DNS::Resolver; my $target = $_[0]; my $ret = 1; $resolver->tcp_timeout( 60 ); $resolver->udp_timeout( 60 ); if ( $target ) { # RFCチェック $ret = $valid->address( -address => $target ); return undef unless( $ret ); my $host = $valid->_host( $target ); # MXレコード検索 my $retry = 3; my $packet = undef; while( $retry-- ) { $packet = $resolver->send( $host, 'MX' ); if ( defined $packet ) { $_[0] = $target; return 1 if ( $packet->header->ancount ); #レコードありの場合 last; } sleep 5; } # Aレコード検索 $retry = 3; $packet = undef; while( $retry-- ) { $packet = $resolver->send( $host, 'A' ); if ( defined $packet ) { $_[0] = $target; return 1 if ( $packet->header->ancount ); #レコードありの場合 return undef; } sleep 5; } # エラーはOKを返す return 1; } return 0; }
トラックバック
- このエントリーにトラックバック:
- http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/163
コメント