カテゴリー
Network

さくらのレンタルサーバーで mailfilter を使ってメール転送

さくらのレンタルサーバーではmaildropというメール配信プログラムを使用しており.forwardは使えません。
かわりに.mailfilterを使うことができます。
これを使って件名でフィルタリングしてメール転送できます。

XSERVER のメールフィルタでメール転送してみよう

フィルタリング転送に必要なもの

対象メールアドレスに対しての.mailfilter

そもそも、さくらのレンタルサーバーではコントロールパネル上で転送設定ができます。(対象アドレスにすべてを転送することしかできません)
この場合も内部でmailfilterを使っています。
コントロールパネルでメール転送を設定すると対象アカウントに下記内容の.mailfilterというファイルが作られます。

cc "!transfer@example.com"

自前で上記内容の.mailfilterを設置すれば、コントロールパネルで設定しなくても一律なメール転送を設定できます。
設置場所は下記となり、対象としたいアカウントごとに作成します。
/home/USER_NAME/MailBox/アカウント/.mailfilter
info@example.com が対象アドレスの場合はアカウントの部分が info となります。

フィルタリング転送したい場合はこの.mailfilterを下記のようにします。

cc "| ../../prog/info_mail.pl transfer@example.com"

2つ上の階層(サーバーアカウントの USER_NAME 階層)のprog/info_mail.plという perl プログラムを参照するという意味です。

文字コードは「EUC+LF 改行」
パーミッション600

フィルタリング用 perl プログラム

上記のパスに合わせて、USER_NAME 階層に prog というフォルダを作りその中に設置します。

#!/usr/bin/perl

require "jcode.pl";
use MIME::Words qw(:all);

$sendmail = '/usr/sbin/sendmail';

#=====================================================
# DECODE する関数
#=====================================================
sub DecodeFld($) {
    my($sBuff) = @_;
    my($sRes, $sWk);
    chomp($sBuff);
    foreach $sWk (decode_mimewords( $sBuff, )){
        ($sTxt, $sCode) = @$sWk;
        $sRes .= $sTxt;
    }
    return $sRes;
}

#=====================================================
# 本体開始
#=====================================================
$subject = '';
$mail_to = '';
$mail_from = '';
$flg_subject =0;
$flg_read_end =0;
$flg_go =0;

#ヘッダ部から情報抽出
while (<STDIN>) {
    
    #ヘッダ情報抽出終了後、パイプを空送りして STDIN を終了させる
    if($flg_read_end){
        next;
    }
    
    #ヘッダ部の終了チェック
    if(length ==1){
        $flg_read_end =1;
        next;
    }
    
    #Subject の取得
    if($flg_subject ==1){
        if(/^[ \t](.+)/){
            $subject .= $1;
        }
        else{
            $flg_subject =2;
        }
    }
    elsif($flg_subject ==0&& /^Subject: (.+)/){
        $subject = $1;
        $flg_subject =1;
    }
    
    #From や To、その他フラグの取得
    if(/^From: .*<(.+)>.*/){
        $mail_from = $1;
    }
    elsif(/^From: (.+)/){
        $mail_from = $1;
    }
    elsif(/^To: .*<(.+)>.*/){
        $mail_to = $1;
    }
    elsif(/^To: (.+)/){
        $mail_to = $1;
    }
}

#Subject のデコード
$subject = &DecodeFld("$subject");  #Subject 欄デコード(JIS コードのまま)

#文字コード変換(JIS→EUC)
&jcode::convert(\$subject, "euc");

#通知メール対象チェック
if($subject =~ /至急.*/){
    $flg_go =1;
}

#通知メール送信
if($flg_go ==1){
    open(MAIL, "| $sendmail -t") or $err =1;
    if ($err ==0) {
        $mailbuff = '';
        $mailbuff .= "To: $ARGV[0]\n";
        $mailbuff .= 'From: new-mail-info@example.com'."\n";
        $mailbuff .= 'Subject: New Mail Arrived.'."\n";
        $mailbuff .= "\n";
        $mailbuff .= 'メールが到着しました。'."\n";
        $mailbuff .= "\n";
        $mailbuff .= '題:'."$subject\n";
        $mailbuff .= "\n";
        $mailbuff .= '発:'."$mail_from\n";
        $mailbuff .= '宛:'."$mail_to\n";
        $mailbuff .= "\n\n.\n";
        &jcode::convert(\$mailbuff, "jis");
        print MAIL $mailbuff;
        close(MAIL);
    }
}

#通知メール対象チェックの項目に subject =~ /至急.*/と指定してあるので、件名に至急で始まるメールは mailfilter での指定アドレスに転送されます。

文字コードは「EUC+LF 改行」
パーミッション700

※転送されずにエラーメッセージが送信される場合はパーミッションが適切でない可能性があります。

mailfilter はいくつでも設定できる

例えば transfer にはすべてのメールを転送して、transfer2 にはフィルタリングでメール着信の連絡をするといったこともできます。

cc "!transfer@example.com"
cc "| ../../prog/info_mail.pl transfer2@example.com"

XSERVER のメールフィルタでメール転送してみよう

profile image

執筆:R3098

WEB サービス構築・監修が生業です。WordPress 関連では Aurora Heatmap などプラグイン開発も行っています。悩めるサイト運営者の無料相談受付けます!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトは reCAPTCHA によって保護されており、Google のプライバシーポリシー および 利用規約 に適用されます。

reCaptcha の認証期間が終了しました。ページを再読み込みしてください。