さくらのレンタルサーバーではmaildropというメール配信プログラムを使用しており.forward
は使えません。
かわりに.mailfilter
を使うことができます。
これを使って件名でフィルタリングしてメール転送できます。
フィルタリング転送に必要なもの
対象メールアドレスに対しての.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"