カテゴリー
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 の認証期間が終了しました。ページを再読み込みしてください。