さくらのレンタルサーバでは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"