#!/usr/bin/perl -- # # Fri,02 Jan,2004 - Sat,31 Jan,2004 # Mon,20 Dec,2004 # Copyright(C)2004 G-HAL # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # 使用法: # # - 本スクリプトを /usr/local/libexec/msgidfilter に EUC で保存し、 # 実行権限を付ける。 # # - .mc ファイルに以下の定義を追加し sendmail.cf を再作成する。 # # LOCAL_CONFIG # Kmsgidfilter program /usr/local/libexec/msgidfilter # # LOCAL_RULESETS # HMessage-Id: $>+CheckMessageId # # SCheckMessageId # R$* $: $(msgidfilter $1 $) # R@NOAT $#discard $: discard # R@NOHOST $#discard $: discard # R@LOCAL $#discard $: discard # R@NODOMAIN $#discard $: discard # R@PRIVATE $@ OK # R@ccTLD $@ OK # R@gTLD $@ OK # R@PRIVATEIP $#discard $: discard # R@IP $@ OK # dnl R$* $#error $@ 5.7.1 $: "553 Header Error" # R$* $#discard $: discard # # 参考: # sendmail による「!広告!」フィルタ # http://www.imasy.or.jp/~ume/adfilter/ # スクリプティング言語資料室(仮) # http://www.kt.rim.or.jp/~kbk/perl5.005/perlre.html # とほほの perl 入門 # http://tohoho.wakusei.ne.jp/wwwperl.htm # RFC 2822 # use strict; my $str = $ARGV[0]; # 参考にした資料には、 # 空白、タブ、改行は sendmail によって # 空白代替文字に置換されている。 # 空白代替文字は cf では confBLANK_SUB で指定され、 # デフォルトは「.」である。 # って書いてあったけれど、実際に試したら、 # 前と後の空白は削除。 # <> 内の文字はそのまま。 # 前と後ろの <> も付く。 # だった。 # # ex. # sendmail への入力: # Message-Id: <123.456 789.abc@localhost.foo.var.baz.private> # このフィルタへの入力: # <123.456 789.abc@localhost.foo.var.baz.private> # # No Machine-name, No Domain, And No AtMark if( $str !~ /\@/i ){ $str = '@NOAT'; } # No Host-Name, No Domain elsif( $str =~ /\@>?$/i ){ $str = '@NOHOST'; } # Setting Miss elsif( $str =~ /\@localhost>?$/i || $str =~ /\@localhost.localdomain>?$/i ){ $str = '@LOCAL'; } # Only Machine-name, No Domain elsif( $str =~ /\@[a-z0-9]>?$/i || $str =~ /\@[a-z0-9][\-a-z0-9]*[a-z0-9]>?$/i ){ $str = '@NODOMAIN'; } # Private Domain elsif( $str =~ /\@(([a-z0-9]|[a-z0-9][\-a-z0-9]*[a-z0-9])\.)+private>?$/i ){ $str = '@PRIVATE'; } # Country Code elsif( $str =~ /\@(([a-z0-9]|[a-z0-9][\-a-z0-9]*[a-z0-9])\.)+[a-z]{2,2}>?$/i ){ $str = '@ccTLD'; } # Generic Top Level Domain # arpa, com,net,org, edu,gov,mil,int # info,biz,name,aero,coop,museum,pro, nato elsif( $str =~ /\@(([a-z0-9]|[a-z0-9][\-a-z0-9]*[a-z0-9])\.)+(arpa|com|net|org|edu|gov|mil|int|info|biz|name|aero|coop|museum|pro|nato)>?$/i ){ $str = '@gTLD'; } # IP address elsif( $str =~ /\@\[?([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\]?>?$/i ){ my @ip; $ip[0] = $1; $ip[1] = $2; $ip[2] = $3; $ip[3] = $4; if( (0 <= $ip[0]) && ($ip[0] <= 255) && (0 <= $ip[1]) && ($ip[1] <= 255) && (0 <= $ip[2]) && ($ip[2] <= 255) && (0 <= $ip[3]) && ($ip[3] <= 255) ){ if( (10 == $ip[0]) || ( (172 == $ip[0]) && (16 <= $ip[1]) && ($ip[1] <= 31) ) || ( (192 == $ip[0]) && (168 == $ip[1]) ) ){ $str = '@PRIVATEIP'; }else{ $str = '@IP'; } } } print "$str"; exit 0; __END__ # [ EOF ]