星期三, 十月 01, 2008

Procmail, Procmailrc 實現一個USER的 email 平均轉寄給三個 email

因工作上的需求,須要將一個user 的信件平均分給另外三個 email,在此利用 procmail 來做這個功能。

主機的上的 mail server 要啟動 procmail 的功能。

在該 user 的 home directory 下,新增一個 .procmailrc!檔案中放入下面幾行

SHELL=/bin/sh

LINEBUF=8192
VERBOSE=0
MAILTO=`/home/user/relay_mail`

:0
* >1
! $MAILTO


其中 relay_mail 是一個程式,它負責丟出一個 email 出來,也就是平均寄送三個 email 中的其中一個,是由它計算出來的!

在我的環境中,這樣子的運作時,會發生一個錯誤(需把 procmail log 打開,比較好抓錯誤),
Program mode requires special privileges, e.g., root or TrustedUser.
這個會寫在 procmail log 中,而這裡頭的 Program 實際上是指 sendmail!
為何是 sendmail 呢?

因為在 procmailrc 的設定檔中, ! $MAILTO 是把信件轉到 $MAILTO 這個信箱,而它完整的
轉換語法是這樣的(假設 $MAILTO=user@user.com):
/usr/sbin/sendmail -oi user@user.com
最後是用 sendmail 來進行寄送的動作。(我的 sendmail 版本是 8.13.1)
而 sendmail 的 mail queue 是在 /var/spool/clientmqueue,
這一個目錄的權限是 770, user:group 都是 smmsp,而現在是讓一個 user 來進行這一個動作,
所以會產生上面的錯誤!

還不知道怎麼把 該 user 加入 TrustedUser,只好先將該 user 的 group 改成 smmsp。
這樣就可以把信轉出去了!


附上 relay_mail 的程式,user perl 寫的!
其中還需要一個設定檔, relay_mail.data
這就是用來記錄要分給哪些人,還有分配的比例,長相如下:
user1@user.com#1#0
user2@user.com#1#0
user3@user.com#2#0
最後一個 0 是記錄分送的數字,每寄出一封信,數字會增加 1!
第二的欄位數子,是比例, user3 會分配到的數字會是其它兩人的兩倍。


#!/usr/bin/perl
my $debug=0;
my ($o_dir, $o_mail_data, @oh_mails, $oa_alldata, $o_data, @oa_data, $o_min_mails, $o_mails, $o_mailto);
$o_dir = '/home/sourcing';
$o_mail_data = "$o_dir/relay_mail.data";

$o_min_mails=99999999;
open MD,$o_mail_data;
while() {
chomp $_;
push @oa_alldata,$_;
next if ( $_ =~ /^#/ );
@oa_data = split('#',$_);
$o_mails = $oa_data[2]/$oa_data[1];
db($o_mails);
if ( $o_mails < $o_min_mails ) { $o_mailto = $oa_data[0]; $o_min_mails = $o_mails; } } close MD; open MD,">$o_mail_data";
foreach(@oa_alldata) {
$o_data = $_;
if ($o_data =~ /^$o_mailto/ ) {
@oa_data = split('#',$o_data);
$oa_data[2] +=1;
$o_data = join('#',@oa_data);
}
print MD $o_data."\n";
}
close MD;
print "$o_mailto\n";


sub db{
print "DEBUG:@_\n" if ( $debug);
}

0 意見: