はじめての自宅サーバ構築 - Fedora/CentOS -
Last Update 2018/05/30
[ 更新履歴 ] [ サイト マップ ] [ 質問掲示板 ] [ 雑談掲示板 ] [ リンク ]
トップ >> メールサーバ >> メール転送機能(procmail)
動作確認 [ FC1 / FC2 / FC3 / FC4 / FC5 / FC6 / Fedora7 / Fedora8 / Fedora9 / Fedora10 / Fedora11 / Fedora12 / Fedora13 / Fedora14 / Fedora15 / Fedora16 / Fedora17 / CentOS4 / CentOS5 / CentOS6 ]
  1. procmailとは・・・
  2. procmailのインストール
  3. postfix 設定ファイル設定
  4. procmailのレシピ設定
  5. procmaiの動作確認
  6. メール転送の内容をカスタマイズ
    「procmail」設定ファイルの確認と設定
    メール転送スクリプト作成
    メール転送スクリプトのダウンロード

■ procmailとは・・・

procmailとは、メールの振り分けを行なうツールです。
振り分けにはレシピ(転送の条件)を設定することにより、さまざまな転送条件を指定することが出来ます。

■ procmailのインストール

# yum -y install procmail

■ postfix 設定ファイル設定

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

■ procmailのレシピ設定

フォワードファイルの設定
# 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
               ↑    ↑                            ↑
            所有者 グループ                        ユーザ

■ procmaiの動作確認

クライアントメールソフトで、件名に"test"と指定し、アカウント"linux"へメールしてみましょう。
レシピに指定した、keitai@xxx.comとpc@xxx.com宛に、転送されます。

■ メール転送の内容をカスタマイズ

自作スクリプトは以下のモジュールを使用しておりますので、事前にダウンロードして指定した位置へ配置してください。 謝辞:素晴らしいライブラリのご提供をとても感謝しております。

■ 「procmail」設定ファイルの確認と設定

フォワードファイル内容の確認
# 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

作成したアカウント宛にメールが届くと、カスタマイズされたメールが指定したアドレスに届きます。

■ コンテンツ関連

■ その他

ページ先頭へ

Copyright(©)2004-2018 First home server construction. All Right Reserved.