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

ヘッダ画像

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

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

元ネタ→さくらのレンタルサーバ非公式FAQ

コメントを残す

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



関連記事

hostsファイルの書き方 ドメインはDNS(ドメインネームサーバ)という仕組みでIPアドレスと紐づけられています。DNSはドメイン(ホスト名)とI...

VPN経由でインターネットにアクセスする VPN接続中にブラウザなどを使いインターネットへ接続する際はクライアント側の設定でVPN接続先のサーバ経由か自分の接続環...

WindowsでVPNに接続できない この記事はWindowsクライアントでのVPN接続についてですが、まずはOSX Serverの話を少々。OSX Serv...

新しいWindowsPCが既存のNASに接続できない Windows7や10など新PCに入れ替えたところ「これまで使えていたNASに接続できなくなった」という症状を耳にします...