- 论坛徽章:
- 1
|
一個我自己的例子, 實際運行中:
- sub filter_sender {
- # .....略, 以下取列表, 非公開的 (NO)僅限制只有成員用員工可以寄
- my $sql="select list from mailing where PUBLIC='NO'";
- $restrict=mysql_query($sql);
- }
- sub filter_recipient {
- my ($recip, $sender, $ip, $hostname, $first, $helo, $rcpt_mailer, $rcpt_host, $rcpt_addr) = @_;
- # 取得 sender 的 Local_Part
- $sender=~ m/\<(.*)@.*\>/;
- $From=$1;
- $sender=~ m/\<(.*)\>/;
- $sender=$1;
- # 取得 RCPT TO 的 Local-Part
- $recip=~ m/\<(.*)@.*\>/;
- my $To=$1;
- # 下列 IP 或特別的 Envelope From 到特別的 TO 不進行檢查動作
- return ('CONTINUE', "ok") if ($ip=~/$my_network/); # 我自己的網路時,不做檢查
- return ('CONTINUE', "ok") if($sender=~/enews.enews4u.com/ and $recip=~/all\@abc.tw/); # 特別允許 enews 可以寄 all
- return ('CONTINUE', "ok") if ($sender=~ /ntu.edu.tw/ and $recip=~/all@/);
- # 如果 RCPT TO 是一個受保護的 Aliases , 進行檢查
- if ($restrict=~ / $To /) {
- # aliases.pl 回應 aliases 中的 user list
- $member=`/usr/bin/aliases.pl $To`;
- # 比對 user list 中是否含有 envelope from
- if ($member=~ /$sender/ ) {
- return ('CONTINUE', "ok");
- } else {
- return ('REJECT', "$recip restrict for member or staff only.");
- }
- }
- return ('CONTINUE', "Ok");
- }
复制代码
- # aliases.pl 程式, aliases 會有 rescurive 之狀況,需注意
- #!/usr/bin/perl
- use DB_File;
- print aliases_lookup($ARGV[0]);
- use DB_File;
- sub aliases_lookup()
- {
- my $user=$_;
- dbmopen(ALIASES,'/etc/aliases.db',0000) || die "can't dbmopen aliases";
- chop($host = `hostname`);
- while ($user = shift) {
- local(%seen);
- if ($short) {
- return " ".join(' ', &resolve($user))." ";
- } else {
- return " ".join(' ', sort &resolve($user))." ";
- }
- }
- dbmclose(ALIASES);
- }
- sub resolve {
- local($addr,$alias,@list,@ilist);
- while ($addr = shift) {
- if ($seen{$addr}++) {
- #push(@list, $addr);
- next;
- }
- $addr .= "\0";
- unless (defined $ALIASES{$addr}) {
- push(@list, &forward($addr));
- next;
- }
- $alias = $ALIASES{$addr};
- $alias =~ s/^\s*(.*)\s*$/$1/;
- if ($alias eq $addr) {
- push(@list, &forward($addr));
- next;
- }
- if ($alias =~ /^"/) {
- push(@list, $alias);
- next;
- }
- if ($alias eq "$addr@$host") {
- push(@list, &forward($addr));
- next;
- }
- if ($alias =~ /^:include:(.*)/) {
- unless (open(INC, $file = $1)) {
- print STDERR "$0: can't open $file: $!\n";
- next;
- }
- @ilist = grep(!/^#/, <INC>);
- for (@ilist) { s/\s//g; }
- close(INC);
- push(@list,&resolve(@ilist));
- } else {
- push(@list,&resolve(split(/\s*,\s*/,$alias)));
- }
- }
- return map { /([^\0]+)/ } @list;
- }
- ##############################################################
- sub forward {
- local($user) = @_;
- local($forward);
- return $user if $user =~ /^\s*"?[|\/]/;
- return $user if $user =~ /^\s*.+@.+$/;
- return $user if $user =~ /^\s*.+\\?!.+$/;
- return $user if $user =~ /^\s*\\/;
- $user = "$user <MAILER-DAEMON>" unless $forward;
- return $user;
- }
- ##############################################################
- sub logdir {
- if (! $been_here_before++) {
- setpwent unless $dbm_passwd = dbmopen(PASSWD,'/etc/passwd', undef);
- }
- if ($dbm_passwd) {
- return '' unless defined $PASSWD{$_[0]};
- local(@a);
- @a = split(/[\000]+/,$PASSWD{$_[0]});
- return $a[$#a-1];
- } else {
- return (getpwnam($_[0]))[7];
- }
- }
复制代码 |
|