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"が含まれていた場合はカーボンコピーして
### (メールボックスに受信メールを残す)
### keitai@xxx.com と pc@xxx.comに転送
:0 c
* ^Subject: .*test.*
! keitai@xxx.com,pc@xxx.com
作成したレシピ設定ファイルの所有者・グループ設定
# 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"へメールしてみましょう。
レシピに指定した、keitai@xxx.comとpc@xxx.com宛に、転送されます。
フォワードファイル内容の確認 # 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='webmaster@xxx.com';
# 転送したいアドレスを設定
@transaddr = ('keitai@xxx.com','pc@xxx.com') ;
# 転送したい本文の文字数
$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 |
作成したアカウント宛にメールが届くと、カスタマイズされたメールが指定したアドレスに届きます。