From owner-FreeBSD-users-jp@jp.FreeBSD.org Thu Apr  7 14:49:40 2005
Received: (from daemon@localhost)
	by castle.jp.FreeBSD.org (8.11.6p2+3.4W/8.11.3) id j375neY40327;
	Thu, 7 Apr 2005 14:49:40 +0900 (JST)
	(envelope-from owner-FreeBSD-users-jp@jp.FreeBSD.org)
Received: from lumiere.sheena.to (ns.chuo-u.ac [218.219.158.187])
	by castle.jp.FreeBSD.org (8.11.6p2+3.4W/8.11.3) with ESMTP/inet id j375n4X40232
	for <FreeBSD-users-jp@jp.freebsd.org>; Thu, 7 Apr 2005 14:49:04 +0900 (JST)
	(envelope-from marin@luna.to)
Received: from artemis.luna.to (193.243.100.220.dy.iij4u.or.jp [220.100.243.193])
	by lumiere.sheena.to (8.11.7/3.7W:02/15/05) with ESMTP id j375mdj13946
	for <FreeBSD-users-jp@jp.freebsd.org>; Thu, 7 Apr 2005 14:48:40 +0900 (JST)
Received: from artemis.luna.to by artemis.luna.to (8.9.3/3.4W2-96012902)
	id OAA02059; Thu, 7 Apr 2005 14:45:42 +0900 (JST)
Message-Id: <200504070545.OAA02059@artemis.luna.to>
To: FreeBSD-users-jp@jp.FreeBSD.org
In-reply-to: Your message of "Thu, 07 Apr 2005 01:05:16 JST"
References: <002401c53ac2$6c3387b0$6e00a8c0@take1> 
Mime-Version: 1.0 (generated by tm-edit 7.100)
Content-Type: text/plain; charset=ISO-2022-JP
From: Harumitsu Shimazaki <marin@luna.to>
Reply-To: FreeBSD-users-jp@jp.FreeBSD.org
Precedence: list
Date: Thu, 07 Apr 2005 14:45:41 +0900
X-Sequence: FreeBSD-users-jp 83952
Subject: [FreeBSD-users-jp 83952] Re: sendmail
 =?ISO-2022-JP?B?GyRCJE5AX0RqGyhC?= 
Sender: owner-FreeBSD-users-jp@jp.FreeBSD.org
X-Originator: marin@luna.to
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+050320


$BEg:j$G$9!#(B

$BA0ED$5$s$d:45W4V$5$s$+$i$b2sEz$,$"$C$?$h$&$G$9$,!"$3$s$J;vNc$b$"$j$^$9!"(B
$B$H$$$&$3$H$G!#!#!#(B

>>>>> takesi2  <takesi2@webcom.ne.jp> writes:

> $BAw?.$7$?%a!<%k$NFbMF$b%5!<%PB&$G>e<j$/%P%C%/%"%C%W$r<h$k$3$H$O(B
> $B=PMh$J$$$b$N$G$7$g$&$+!)(B
> $BNc$($P(BFrom$B$,(Binfo@exsample.com$B$GAw$C$?%a!<%k$N$_FCDj$N>l=j$K(B
> $BJ]B8$7$?$$$N$G$9!#(B

> $B$"$k0UL#8!1\$K$J$C$F$7$^$$$=$&$J@_Dj$J$N$G!"(B

$B$^$5$K!"$3$&$$$&!V%$%d$J!WL\E*$G:n$C$?$b$N$G$9!#(B

sendmail.cf $B$,(B CF $B$rA0Ds$H$7$F$?$j8E$$$b$N$G$9$,;29M$^$G$K!#(B
$BIJ<AE*$K$O!V$&$A$G$OLdBj$J$/F0$$$F$?!W$H$$$&DxEY$N$b$N$G$9!#(B


0) $B$G$-$k$3$H(B

$BFCDj$N(B from $B$d(B to $B$r%Q%?!<%s%^%C%A$5$;$F!VDL2a$7$?%a!<%k$r7h$a$i$l$??M(B
$B$K%3%T!<E>Aw$9$k!W!V%j%8%'%/%H$7$F7h$a$i$l$??M$KE>Aw$9$k!W$,$G$-$^$9!#(B


1) CF $B$G$N@_Dj$K0J2<$N$b$N$rAH$_9~$`(B

EXTERNAL_MAILER_PATH=/etc/mail/mf/mf.pl
EXTERNAL_MAILER_FLAG='mDFMuXnP'
EXTERNAL_MAILER_ARGS='mf.pl $h $g $u'

2) /etc/mail/mf/ $B$N2<$K(B 

message_bcc.txt
$B!Z$3$N%a!<%k$O%a!<%k%7%9%F%`$K$h$j<+F0E*$K%3%T!<$5$l$?$b$N$G$9![(B

message_deny.txt
$B!Z$3$N%a!<%k$O%a!<%k%7%9%F%`$K$h$jCf7Q$r5q@d$5$l$^$7$?![(B

$B$H$$$&%U%!%$%k$r(B jis $B$G:n$k(B

3) $B@_Dj%U%!%$%k$O(B /etc/mail/mf/mf.list $B$H$7$F:n$k(B

#option   match                 argument
copy who@where.com	addr1@example.jp,addr2@where.com
deny bar@where.com	addr3@example.co.jp,addr4@whare.com

$B$H$+!#(B

4) $B<B9T5v2D$r$b$D(B mf.pl $B$r(B /etc/mail/mf $B$N2<$KCV$$$F$*$/!#(B

#!/usr/local/bin/perl

# Mail Filter v.01 invoked by EXTERNAL_MAILER (sendmail-mf.cf generated by CF)
# by marin@ctie.co.jp
# based on mailfilter.pl (CF-3.7Wpl2/support/restriction/mail_filter.pl)
#

# argv[1] = $opt
# argv[2] = $src
#

# -- mf.list --
# # option	match				argument
# copy	who@where.com			ad1@where.com,ad2@where.com,ad3@where.com
# copy	who@localserver.where.com	ad1@where.com,ad2@where.com,ad3@where.com
# # restrited mail return to sender
# deny	who@where.com
# deny	who@localserver.where.com
# # restrited mail return to argument (not return to sender)
# deny	who@where.com			ad1@where.com,ad2@where.com,ad3@where.com
# deny	who@localserver.where.com	ad1@where.com,ad2@where.com,ad3@where.com
#

### init ###


$base_dir = "/etc/mail/mf";

$mf_list = "$base_dir/mf.list";
$message_bcc = "$base_dir/message_bcc.txt";
$message_deny = "$base_dir/message_deny.txt";
$log = "$base_dir/mf.log";

$sendmail = "/usr/sbin/sendmail";

$op_copy = "copy";
$op_deny = "deny";


$ENV{'PATH'}="/bin:/usr/bin:/usr/local/bin";
umask(077);

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$now = sprintf("%02d/%02d/%02d %02d:%02d:%02d",
	       $year, $mon+1, $mday, $hour, $min, $sec);

$separator = sprintf("-Multipart_(%02d_%02d_%02d_%02d:%02d:%02d_%d)-",
		     $year+1900, $mon+1, $mday, $hour, $min, $sec, $$);

##open (LOG, ">>/tmp/mf.log");

### handring arguments ###

$opt = shift;
$src = shift;
#if ($src =~ /^([\w\%\@\.-]+)$/) {
if ($src =~ /^([\w\@\.\/-]+)$/) {
    $src = $1;	# secure
} else {
    print "554 Insecure sender address string.\n";
    exit 64;	# EX_USAGE
}

foreach $i (@ARGV) {
#	if ($i =~ /^([\w\%\@\.-]+)$/) {	# you may need more characters
    if ($i =~ /^([\w\@\.\/-]+)$/) {
	push (@dst_list, $1);	# secure
    } else {
	print "554 Insecure recipirnt address string.\n";
	exit 64;	# EX_USAGE
    }
}

### parse mf_list ###

if (open(MF, "<$mf_list")) {
    while(<MF>) {
	chop;
	next if (/^$/);
	next if (/^\#/);
	push(@mf_pattern, $_);
    }
    close(MF);
}


### match ###

$ope = "";	# $ope = {"" | "copy" | "deny"}
$match_addr = "";
undef $operand;

$src_match = 1;

foreach $addr ($src, @dst_list) {
    foreach $mf_line (@mf_pattern) {
	($mf_ope, $mf_match, $remainder) = split (/\s+/, $mf_line);

	if ($addr =~ /^$mf_match/) {
	    if ($ope eq ""  || $ope eq $op_copy) {
		$ope = $mf_ope;
		$operand = $remainder;
		$match_addr = $addr;
	    }
	    if ($src_match && $ope eq $op_deny && $mf_ope eq $op_deny) {
#		$ope = $mf_ope;
		$operand = $remainder;
		$match_addr = $addr;
	    }
	}
    }
    $src_match = 0;
}

### through ###

if ($ope eq "") {
    $dst = join(' ', @dst_list);
    if (open(MAIL, "| $sendmail -f $src $dst")) {
#		print MAIL "$src $dst\n";
##	print MAIL "X-MTA: mf.pl src=($src) dst=($dst) mf_match=($mf_match)\n";
	while (<STDIN>) {
	    print MAIL $_;
	}
    } else {
	print "554 Can't exec sendmail.\n";
	exit 78;	# EX_CONFIG
    }
    exit 0
}

### deny ###

if ($ope eq $op_deny) {
    if (not defined $operand) {
	$operand = ($src);
    }

    if (open (MAIL, "| $sendmail -f '<>' $operand")) {
	print MAIL "Subject: Returen mail: Transfer denied\n";
	print MAIL "From: MAILER-DAEMON\n";
	print MAIL "To: $operand\n";
	print MAIL "Mime-Version: 1.0\n";
	print MAIL "Content-Type: Multipart/Mixed;\n";
	print MAIL " boundary=\"$separator\"\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n";
	print MAIL "\n";
	
	print MAIL "\n--$separator\n";
	print MAIL "Content-Type: text/plain; charset=ISO-2022-JP\n";
	print MAIL "\n";
	
	if (open (MSG, "<$message_deny")) {
	    while (<MSG>) {
		print MAIL "     $_\n";
	    }
	    close (MSG);
	} else {

##	    print LOG ">>>> cannot find $message_deny [deny]\n";
	    
	}

	print MAIL "\n";

	print MAIL "\n--$separator\n";
	print MAIL "Content-Type: message/rfc822\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n";
	print MAIL "\n";

	while (<STDIN>) {
	    print MAIL $_;
	}
    print MAIL "\n--$separator--\n";

    } else {
	print "554 Can't exec sendmail.\n";
	exit 78;	# EX_CONFIG
    }
    
    exit 0;
}


### copy ###    

if ($ope eq $op_copy) {

    $dst = join(' ', @dst_list);

    if (open (MAIL2, "| $sendmail -f $src $dst")) {
	
	if (open (MAIL, "| $sendmail -f '<>' $operand")) {
	    print MAIL "Subject: [Auto Blind Carbon Copy System]\n";
	    print MAIL "From: MAILER-DAEMON\n";
	    print MAIL "To: $operand\n";
	    print MAIL "Mime-Version: 1.0\n";
	    print MAIL "Content-Type: Multipart/Mixed;\n";
	    print MAIL " boundary=\"$separator\"\n";
	    print MAIL "Content-Transfer-Encoding: 7bit\n";
	    print MAIL "\n";
	    
	    print MAIL "\n--$separator\n";
	    print MAIL "Content-Type: text/plain; charset=ISO-2022-JP\n";
	    print MAIL "\n";
	    
	    if (open (MSG, "<$message_bcc")) {
		while (<MSG>) {
		    print MAIL "     $_\n";
		}
		close (MSG);
	    } else {

##		print LOG ">>>> cannot find $message_bcc [copy]\n";
	    
	    }
	    
	    print MAIL "  This mail matches mail filter pattern: $match_addr\n";
	    print MAIL "\n";
	    
	    print MAIL "\n--$separator\n";
	    print MAIL "Content-Type: message/rfc822\n";
	    print MAIL "Content-Transfer-Encoding: 7bit\n";
	    print MAIL "\n";
	    
	    while (<STDIN>) {
		print MAIL $_;
		print MAIL2 $_;
	    }
	    
	    print MAIL "\n--$separator--\n";
	    
	} else {
	    print "554 Can't exec sendmail.\n";
	    exit 78;	# EX_CONFIG
	}

    } else {
	print "554 Can't exec sendmail.\n";
	exit 78;	# EX_CONFIG
    }

    exit 0;
}

##print LOG "XXX Failed! ope -- ope=($ope) src=($src) dst=($dst) mf_match=($mf_match)\n";


----
$BEg:j(B $BM[8w(B   (connected by optical fiber)
marin@luna.to, marin@ctie.co.jp, marin@kt.rim.or.jp (pet ready)
