procmailとは、メールの振り分けを行なうツールです。
振り分けにはレシピ(転送の条件)を設定することにより、さまざまな転送条件を指定することが出来ます。
# yum -y install procmail |
procmail のパスを確認 # which procmail /usr/bin/procmail 設定ファイル修正(追加) # vi /etc/postfix/main.cf : : #mailbox_command = /some/where/procmail #mailbox_command = /some/where/procmail -a "$EXTENSION" 下記の 1 行を追加(procmail のパスは上記実行結果) mailbox_command = /usr/bin/procmail postfiixを再起動する 【FC1 から Fedora15 / CentOS4 / CentOS5 / CentOS6 の場合】 # /etc/rc.d/init.d/postfix restart 【Fedora16以降 の場合】 # systemctl restart postfix.service |
フォワードファイルの設定 # vi /home/linux/.forward "|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #linux" 最後の#の後ろに自分のアカウント(ユーザ名を指定します) 作成したフォワードファイルの所有者・グループ設定 # chown linux:linux /home/linux/.forward レシピを設定(#で始まる部分はコメント行になります) # vi /home/linux/.procmailrc PATH=/bin:/usr/bin:/usr/sbin # procmailが使用するパス LOGFILE=$HOME/procmail.log # ログファイル名 LOCKFILE=$HOME/.lockfile # ロックファイル名 MAILDIR=$HOME/Maildir/ # メール格納場所 DEFAULT=$MAILDIR # レシピにマッチしなかった場合の格納場所 ### Subject:に"test"が含まれていた場合はカーボンコピーして ### (メールボックスに受信メールを残す) ### [email protected] と [email protected]に転送 :0 c * ^Subject: .*test.* ! [email protected],[email protected] 作成したレシピ設定ファイルの所有者・グループ設定 # chown linux:linux /home/linux/.procmailrc 「.forward」「.procmailrc」設定ファイルの所有者・グループは該当するユーザ名である事に注意 # ls -la /home/linux/.forward -rw-r--r-- 1 linux linux 64 8月 3 11:53 /home/linux/.forward # ls -la /home/linux/.procmailrc -rw-r--r-- 1 linux linux 152 8月 3 11:53 /home/linux/.procmailrc ↑ ↑ ↑ 所有者 グループ ユーザ |
クライアントメールソフトで、件名に"test"と指定し、アカウント"linux"へメールしてみましょう。
レシピに指定した、[email protected]と[email protected]宛に、転送されます。
フォワードファイル内容の確認 # cat /home/linux/.forward "|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #linux" レシピ設定ファイルを以下の様にする # vi /home/linux/.procmailrc PATH=/bin:/usr/bin:/usr/sbin # procmailが使用するパス LOGFILE=$HOME/procmail.log # ログファイル名 LOCKFILE=$HOME/.lockfile # ロックファイル名 MAILDIR=$HOME/Maildir/ # メール格納場所 DEFAULT=$MAILDIR # レシピにマッチしなかった場合の格納場所 ### メールが届いたらカスタマイズcgiを実行する 下記の"c"(カーボンコピー)が入っている事に注意 "c"が無いと、転送後にオリジナルのメールは破棄されてしまいます。 :0 c |$HOME/maildelivery.cgi |
カスタマイズcgiの作成 # vi /home/linux/maildelivery.cgi #!/usr/local/bin/perl #=================================================================== # MailDelivery Version 1.0 # Copyright (c) First home server construction. # http://kajuhome.com/ #=================================================================== #==============任意設定(ここから)================ # 差出人のアドレス $sender='[email protected]'; # 転送したいアドレスを設定 @transaddr = ('[email protected]','[email protected]') ; # 転送したい本文の文字数 $transcnt = 400 ; # 内容がHTMLメールだけでも転送する(1:Yes / 0:No) $transhtm = 0; #==============任意設定(ここまで)================ ################################################# # sendmailの実行モジュール $sendmail = '/usr/sbin/sendmail'; # Perl汎用関数集 require '/usr/lib/perl-lib.pl'; # BASE変換ライブラリ(MIMEエンコード) require "/usr/lib/mimew.pl"; ## BASE変換ライブラリ(MIME デコード) require "/usr/lib/mimer.pl"; # メールファイル(一時ワーク) $tmp_file = "$ENV{'HOME'}/maildelivery.tmp"; ################################################# push(@INC,'/usr/lib/perl5/network_modules/modules'); require MIME; @tmp=<>; open(TMP,">$tmp_file"); print TMP @tmp; close(TMP); my $FH = Symbol::gensym(); open($FH, "< $tmp_file"); my $mime = MIME->new(File => $FH); $mime->decode_message( Convert => "euc", Uudecode => 1, Suffix => [qw(gif png jpeg jpg txt text html htm doc)], ); # ヘッダ情報を取得 @header = $mime->header(); # ヘッダ各種情報取得 $subject = $mime->header('Subject'); $from = $mime->header('From'); $to = $mime->header('To'); $cc = $mime->header('Cc'); $date = $mime->header('Date'); # ボディ部を取得 $content = $mime->content(); # plainタイプのデータを全て得る @plain = $mime->content('plain'); # htmlタイプのデータを全て得る @html = $mime->content('html'); # ========== plain ========== $tmp_plain = ""; foreach $plain(@plain){ $tmp_plain .= $plain; } $tmp_plain =~ s/ //g; # ========== html ========== $tmp_html = ""; foreach $html(@html){ $tmp_html .= $html; } $tmp_html =~ s/ //g; @send_body = (); if("" ne $tmp_plain){ @send_body = @plain; }elsif("" ne $tmp_html){ if($transhtm eq "1"){ @send_body = @html; }else{ push(@send_body,"!! HTMLメールの為、転送していません !!"); } }else{ push(@send_body,"!! 本文がありません !!"); } $plain_tmp = ""; foreach $send_body(@send_body){ $plain_tmp .= $send_body; } $edt_mail_body = &ksubstr($plain_tmp, 0, $transcnt); # メール本文 @mbody=(); push(@mbody,"以下のメールが[$to]に届きました。\n"); push(@mbody,"------------------------------------------------------------\n"); push(@mbody," 差出人:$from\n"); push(@mbody," 件名:$subject\n"); push(@mbody,"受信日時:$date\n"); push(@mbody,"\n"); push(@mbody,"[本文]\n"); push(@mbody,"$edt_mail_body\n"); push(@mbody,"------------------------------------------------------------\n"); push(@mbody,"※)本文は先頭より[$transcnt]文字転送しています。\n"); # メールタイトルエンコード $msub = &mimeencode("[kaju mail] New mail arrived"); foreach $transaddr ( @transaddr ) { # sendmail起動 open(MAIL,"| $sendmail -t"); print MAIL "To: $transaddr\n"; print MAIL "From: $sender\n"; print MAIL "Subject: $msub\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "X-Mailer: kaju original\n\n"; foreach $mbody(@mbody) { &jcode'convert(*mbody, 'jis'); print MAIL $mbody; } close(MAIL); } close($FH); unlink($tmp_file); exit 0; __END__ 作成したcgiスクリプトに実行権付与 # chmod 700 /home/linux/maildelivery.cgi 作成したcgiスクリプトの所有権設定 # chown linux /home/linux/maildelivery.cgi |
*:「linux」ユーザでの使用を例として、ダウンロードした「maildelivery.tar」ファイルが「/root/」にあるとします。 ユーザディレクトリに移動 # cd /home/linux/ tarファイルを展開 # tar xvf /root/maildelivery.tar 所有者・グループの変更 # chown linux:linux maildelivery.cgi ファイルの確認 # ls -l maildelivery.cgi -rwx------ 1 linux linux 4110 8月 3 11:11 maildelivery.cgi |
作成したアカウント宛にメールが届くと、カスタマイズされたメールが指定したアドレスに届きます。