亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4372 | 回復(fù): 17
打印 上一主題 下一主題

[Mail] 請(qǐng)教一段代碼,關(guān)于mimedefang [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-05-28 13:23 |只看該作者 |倒序?yàn)g覽
以前沒有學(xué)過perl,現(xiàn)在突然領(lǐng)導(dǎo)給一個(gè)任務(wù),用mimedefang做sendmail的milter,對(duì)郵件組的發(fā)送權(quán)限進(jìn)行控制,
昨天臨時(shí)看了一下perl,在mimedefang-filter中加了一段代碼,但是測(cè)試時(shí),所有人都不能對(duì)all組發(fā)郵件了,
說明:我的思路是,先對(duì)收件人進(jìn)行檢查,如果收件人是all@rhel4.local,則再檢查發(fā)件人是不是在文件all_allow內(nèi),如果不在就REJECT.
         如果收件人不是all@rhel4.local則直接放行。以是下代碼:


  1. sub filter_recipient {
  2.     use strict;
  3.     my ($recipient, $sender, $ip, $hostname, $first, $helo,$rcpt_mailer, $rcpt_host, $rcpt_addr) = @_;
  4.     if ($recipient =~ /^<?all\@rhel4\.local>?$/i) {
  5.         open (FILE,'/etc/mail/all_allow') || die "Can't open file:$!\n";
  6.         while ($line = <FILE>) {
  7.                 if ($line =~ /$sender/) {
  8.                    return ('CONTINUE', "ok");
  9.                     }
  10.                 return ('REJECT', 'Sorry; you are not allowed to mail to [email]all@rhel4.local[/email]');
  11.                 }
  12.         }
  13.     return ('CONTINUE', "ok");
  14. }
復(fù)制代碼

各位有誰接觸過mimedefang,指點(diǎn)一下吧,謝謝!

論壇徽章:
1
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17
2 [報(bào)告]
發(fā)表于 2008-05-28 14:07 |只看該作者
# 在 SMTP rcpt to 指令後, mimedefang 做這個(gè) sub
sub filter_recipient {
    use strict;
# mimedefang 固定傳給此 sub 之參數(shù)
    my ($recipient, $sender, $ip, $hostname, $first, $helo,$rcpt_mailer, $rcpt_host, $rcpt_addr) = @_;
# 收件人(一封信有時(shí)會(huì)有很多收件人,一個(gè) rcpt to 會(huì)觸發(fā)一起此  sub )若含有 all@....  (@ 是 perl 的限制字元,所以要用 \@)
    if ($recipient =~ /^<?all\@rhel4\.local>?$/i) {
# 開啟一個(gè)檔案
        open (FILE,'/etc/mail/all_allow') || die "Can't open file!\n";
# 循序讀檔
        while ($line = <FILE> {
# 該行若有寄件人,則表示可以寄給 all@.. , 此處有個(gè)小地方要注意, $sender 若沒有限制,容易形成問題
                if ($line =~ /$sender/) {
                   return ('CONTINUE', "ok";
                    }
#若無則拒絕
                return ('REJECT', 'Sorry; you are not allowed to mail to all@rhel4.local');
                }
        }
#沒有寄給 all@... 就直接 ok 了
    return ('CONTINUE', "ok";
}

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2008-05-28 14:25 |只看該作者
原帖由 abel 于 2008-5-28 14:07 發(fā)表
# 在 SMTP rcpt to 指令後, mimedefang 做這個(gè) sub
sub filter_recipient {
    use strict;
# mimedefang 固定傳給此 sub 之參數(shù)
    my ($recipient, $sender, $ip, $hostname, $first, $helo,$rcpt_mai ...



謝謝回復(fù),你說的all包括在收件中這樣的情況我真還沒有考慮到,謝謝提醒!不過我剛才有人給我指出這個(gè)段代碼,他說只有被匹配的sender在all_allow的第一行才能返回'CONTINUE', "ok",如果不在第一行,即使是在all_allow列表中,也不會(huì)返回'CONTINUE', "ok"的,我的錯(cuò)應(yīng)該就在從表中查找sender這一環(huán)節(jié)上,以前從未接觸過perl,不知道應(yīng)該怎么查?

論壇徽章:
1
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17
4 [報(bào)告]
發(fā)表于 2008-05-28 14:27 |只看該作者
一個(gè)我自己的例子, 實(shí)際運(yùn)行中:



  1. sub filter_sender {
  2. # .....略, 以下取列表, 非公開的 (NO)僅限制只有成員用員工可以寄
  3. my $sql="select list from mailing where PUBLIC='NO'";
  4. $restrict=mysql_query($sql);

  5. }

  6. sub filter_recipient {
  7. my ($recip, $sender, $ip, $hostname, $first, $helo, $rcpt_mailer, $rcpt_host, $rcpt_addr) = @_;

  8. # 取得 sender 的 Local_Part
  9. $sender=~ m/\<(.*)@.*\>/;
  10. $From=$1;
  11. $sender=~ m/\<(.*)\>/;
  12. $sender=$1;

  13. # 取得 RCPT TO 的 Local-Part
  14. $recip=~ m/\<(.*)@.*\>/;
  15. my $To=$1;

  16. # 下列 IP 或特別的 Envelope From 到特別的 TO 不進(jìn)行檢查動(dòng)作
  17. return ('CONTINUE', "ok") if ($ip=~/$my_network/); # 我自己的網(wǎng)路時(shí),不做檢查
  18. return ('CONTINUE', "ok") if($sender=~/enews.enews4u.com/ and $recip=~/all\@abc.tw/); # 特別允許 enews 可以寄 all
  19. return ('CONTINUE', "ok") if ($sender=~ /ntu.edu.tw/ and $recip=~/all@/);

  20. # 如果 RCPT TO 是一個(gè)受保護(hù)的 Aliases , 進(jìn)行檢查
  21. if ($restrict=~ / $To /) {
  22.         # aliases.pl 回應(yīng) aliases 中的 user list
  23.         $member=`/usr/bin/aliases.pl $To`;
  24.         # 比對(duì) user list 中是否含有 envelope from
  25.         if ($member=~ /$sender/ ) {
  26.                 return ('CONTINUE', "ok");
  27.         } else {
  28.                 return ('REJECT', "$recip restrict for member or staff only.");
  29.         }
  30. }
  31. return ('CONTINUE', "Ok");
  32. }

復(fù)制代碼


  1. # aliases.pl 程式, aliases 會(huì)有 rescurive 之狀況,需注意
  2. #!/usr/bin/perl

  3. use DB_File;
  4. print aliases_lookup($ARGV[0]);


  5. use DB_File;

  6. sub aliases_lookup()
  7. {
  8. my $user=$_;
  9. dbmopen(ALIASES,'/etc/aliases.db',0000) || die "can't dbmopen aliases";
  10. chop($host = `hostname`);
  11. while ($user = shift) {
  12.     local(%seen);
  13.     if ($short) {
  14.         return " ".join(' ', &resolve($user))." ";
  15.     } else {
  16.         return  " ".join(' ', sort &resolve($user))." ";
  17.     }
  18. }
  19. dbmclose(ALIASES);
  20. }
  21. sub resolve {
  22.     local($addr,$alias,@list,@ilist);

  23.     while ($addr = shift) {
  24.         if ($seen{$addr}++) {
  25.             #push(@list, $addr);
  26.             next;
  27.         }
  28.         $addr .= "\0";
  29.         unless (defined $ALIASES{$addr}) {
  30.             push(@list, &forward($addr));
  31.             next;
  32.         }
  33.         $alias = $ALIASES{$addr};
  34.         $alias =~ s/^\s*(.*)\s*$/$1/;
  35.         if ($alias eq $addr) {
  36.             push(@list, &forward($addr));
  37.             next;
  38.         }
  39.         if ($alias =~ /^"/) {
  40.             push(@list, $alias);
  41.             next;
  42.         }
  43.         if ($alias eq "$addr@$host") {
  44.             push(@list, &forward($addr));
  45.             next;
  46.         }
  47.         if ($alias =~ /^:include:(.*)/) {
  48.             unless (open(INC, $file = $1)) {
  49.                 print STDERR "$0: can't open $file: $!\n";
  50.                 next;
  51.             }
  52.             @ilist = grep(!/^#/, <INC>);
  53.             for (@ilist) { s/\s//g; }
  54.             close(INC);
  55.             push(@list,&resolve(@ilist));
  56.         } else {
  57.             push(@list,&resolve(split(/\s*,\s*/,$alias)));
  58.         }
  59.     }
  60.     return map { /([^\0]+)/ } @list;
  61. }


  62. ##############################################################

  63. sub forward {
  64.      local($user) = @_;
  65.      local($forward);

  66.      return $user if $user =~ /^\s*"?[|\/]/;
  67.      return $user if $user =~ /^\s*.+@.+$/;
  68.      return $user if $user =~ /^\s*.+\\?!.+$/;
  69.      return $user if $user =~ /^\s*\\/;

  70.      $user = "$user <MAILER-DAEMON>" unless $forward;
  71.      return $user;

  72. }

  73. ##############################################################

  74. sub logdir {
  75.     if (! $been_here_before++) {
  76.         setpwent unless $dbm_passwd = dbmopen(PASSWD,'/etc/passwd', undef);
  77.     }

  78.     if ($dbm_passwd) {
  79.         return '' unless defined $PASSWD{$_[0]};
  80.         local(@a);
  81.         @a = split(/[\000]+/,$PASSWD{$_[0]});
  82.         return $a[$#a-1];
  83.     } else {
  84.         return (getpwnam($_[0]))[7];
  85.     }
  86. }

復(fù)制代碼

論壇徽章:
1
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17
5 [報(bào)告]
發(fā)表于 2008-05-28 14:32 |只看該作者
在你的 open 處,改成

  1. #前略
  2.   open (FILE,'/etc/mail/all_allow') || die "Can't open file:$!\n";
  3. -        while ($line = <FILE>) {
  4. +      $sender=~s/[<>]//;  # 要去掉 < , > 字符,因?yàn)槟愕?all 裏很可能沒有 <, >
  5. +       @lines=<FILE>;
  6. +       if (join(@lines(" ",@lines)=~/$sender/i) {
  7. -                if ($line =~ /$sender/) {
  8.                    return ('CONTINUE', "ok");
  9.                     }
  10. +        else {     
  11.                 return ('REJECT', 'Sorry; you are not allowed to mail to [email]all@rhel4.local[/email]');
  12.                 }
復(fù)制代碼


最後,提醒您,利用 md_syslog('info',"Your Debug Messagesender $recip"; 等方式來除錯(cuò)

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2008-05-28 14:36 |只看該作者

回復(fù) #4 abel 的帖子

哎呀,我遇到偶像了,你是用數(shù)據(jù)庫來存放要查詢的列表?我領(lǐng)導(dǎo)就要求我用MIMEDEFANG做這些,由于不會(huì)perl,就決定先做一個(gè)不用數(shù)據(jù)庫的,然后學(xué)習(xí)perl,再進(jìn)行下一步。以后得多向你請(qǐng)教了,謝謝!
不多說了,還是先研究一下你的實(shí)現(xiàn)方法吧,3Q!

論壇徽章:
1
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17
7 [報(bào)告]
發(fā)表于 2008-05-28 15:00 |只看該作者
還有 N 種方式可以達(dá)到你的需求
像在 open 後用

if ( grep(/^$sender$/, <FILE>)

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2008-05-28 16:15 |只看該作者
可惜呀,我住在金屋子里,卻看不到金子,還在拼命的找金子,以后得努力把perl學(xué)好才行。新到公司上班,但愿領(lǐng)導(dǎo)能多給點(diǎn)時(shí)間吧。
對(duì)了,abel:你說的[code]利用 md_syslog('info',"Your Debug Messagesender $recip"; 等方式來除錯(cuò)[/code]
是把這句話加到代碼的中間嗎?

論壇徽章:
1
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17
9 [報(bào)告]
發(fā)表于 2008-05-28 16:54 |只看該作者
原帖由 sunrocs 于 2008-5-28 16:15 發(fā)表
可惜呀,我住在金屋子里,卻看不到金子,還在拼命的找金子,以后得努力把perl學(xué)好才行。新到公司上班,但愿領(lǐng)導(dǎo)能多給點(diǎn)時(shí)間吧。
對(duì)了,abel:你說的[code]利用 md_syslog('info',"Your Debug Messagesender $ ...

是的,加入你想要加的任何一處都可以
它會(huì)把訊息寫到 syslog 中, $SyslogFacility="???"  (? 為自己設(shè),例如 mail/local[0-7]/auth/cron......

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2008-05-28 17:57 |只看該作者
暈死,走了很彎路,mimedefang用的filter文件是/etc/mail/mimedefang-filter,我一直在改/etc/mimedefang-filter,我說怎么一點(diǎn)作用都沒有呢

#前略
  open (FILE,'/etc/mail/all_allow') || die "Can't open file!\n";
-        while ($line = <FILE> {
+      $sender=~s/[<>]//;  # 要去掉 < , > 字符,因?yàn)槟愕?all 裏很可能沒有 <, >
+       @lines=<FILE>;
+       if (join(@lines(" ",@lines)=~/$sender/i) {
-                if ($line =~ /$sender/) {
                   return ('CONTINUE', "ok";
                    }
+        else {     
                return ('REJECT', 'Sorry; you are not allowed to mail to all@rhel4.local');
                }


紅色的那句是什么意思呀,沒看太懂?那句老是報(bào)錯(cuò),是不是少一個(gè)“)”,但是加上也報(bào)錯(cuò)。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP