2008年7月30日

一支Perl程式

寫了一支function(sendmail)與一支Perl程式,我先說明function的部分:

呼叫sendmail只要傳入陣列即可,陣列中有三個必要的KEY為EMAIL,TEMPLATE,TMP(均需為大寫),其餘的KEY則是配合樣版增減,如果樣版中有<!-USERNAM-!>則陣列中就必須有$mail_date[USERNAM],樣版的識別字必須與陣列的KEY大小寫一樣(強烈建議大寫),傳入的值以POST的方式送出到發信的genmail.pl,這個function在測試與正式主機上會有一行不一樣(參閱func內註解)如此將差異封裝在函數內,那開發的人就不需要每次都要去判斷程式執行階段是測試還是正式了,反正都是呼叫同一個function。

另外就是perl程式,目前我們對發送mail的PL程式均將樣版需要的KEY   <!-KEY-!>訂死在程式內所以每次有新的需求均要重新寫一支PL,我將其改成由POST傳入的變數決定,這樣就不需要每次都要再寫一次Perl程式,日後程式管理上也比較容易。這支PERL目前在x.x.x.x/cgi-bin/newmail/SendMail/genmail.pl有空的人可以看一下,看看有沒有需要改進的地方~

補充說明

所以呼叫func時$mail_date[TEMPLATE]=” webevent/nbasoedm/nbasoedm.html.template”;,這樣程式上到正式區也不用改程式。

 

#!/usr/bin/perl
use CGI;
use lib "/usr/local/perl/modules";
$query = new CGI;

print $query->header;
foreach ($query->param()) {
    my $value=$query->param($_);
    if ($_ eq "TMP"){
            $tmp="/tmp/".$value;
    }elsif ($_ eq "TEMPLATE"){
            $template="/usr/local/apache2/htdocs/newmail/SendMail/".$value;
        #$template="/var/www/html/SendMail/".$value;
    }else{
               $data{$_}=$value;
    }   
}
##sending email    
open (TEMPLATE, $template) || die("Cannot open html");
@lines = <TEMPLATE>;
close(TEMPLATE);
open (OUTFILE, ">$tmp") || die("Cannot open tmp error");
foreach $line (@lines) {
    chomp $line;
    my $x=change($line);
    print OUTFILE "$x\n";
}
close(OUTFILE);

$cmd = "/usr/lib/sendmail -t < $tmp  >& /dev/null";
    system($cmd);

sub change{   
    foreach $key (keys %data) {
        my $x="<!-$key-!>";
        $_[0] =~ s/$x/$data{$key}/g;       
    }
    return $_[0];
}