サーバーはさくらインターネットを利用しています。
このサーバーの配信プログラムはmaildrop を使用しています。
Q.
本文に特定の文字が入ったメールだけ転送する設定のやり方を教えてください。
.mailfilterに数行、記述をおこなうだけで出来る安易な方法だと思うのですが、記述の仕方がわかりません。
何度かここで質問しましたが解決に至っていません。
参考URLだけの回答は要りません。
.mailfilterに記述するソースをそのまま書いてください。
よろしくお願い致します。
正規表現という規則で記述しないとだめなのです。
たとえば
if ( /^content-type:[ \t]*text\/html.*/ )
{
to "./Maildir.spam/"
}
正規表現の解説は本1冊くらいかかります。
メールの文字コードはJISですので、テキストエディタではなくバイナリエディタで確認してください。
目的の文字列を記述したファイルをJISで保存して、バイナリエディタで開いてみると良いです。
BZやEdbixならJISにも対応しています。
「BZ」
http://www.vector.co.jp/soft/win95/util/se032859.html
テキストエディタで確認できる16進コードはSJISですので、マッチしないと思います。
※JISでもマッチしないかもしれませんが、試してみてください。
特定の文字を含まないメールもすべて送信されてくるということは、他の記述にマッチしているのだと思います。
.mailfilterのファイルに
if ( /^content-type:.*charset=.*(ISO-2022-JP).*/ )
{
to "!postmaster@example\.sakura\.ne\.jp"
}
上記の記述を削除した状態で、メールが転送されるか確認してみてください。
※まず、特定の文字列が英数字の場合に問題なく動作するかを試し、その後で日本語で動作するか試してみると良いです。
(一応、特定の日本語をそのまま記述する方法も試してみてください。駄目ならJISの16進コードで…)
特定の文字列を含むメールのみ転送されるようになった場合は、以下のように書き直すと良いです。
if ( /^(C|c)ontent-(T|t)ype:.*charset=.*(ISO|iso)-2022-(JP|jp).*/)
{
if ( /.*\x24\x4f\x24\x46\x24\x4a.*/:b )
{
cc "!postmaster@example\.sakura\.ne\.jp"
}
}
上記の場合、文字コードがISO-2022-JPで、なおかつ本文に「はてな」を含むメールのみ転送されます。
※「\x24\x4f\x24\x46\x24\x4a」=「はてな」
(文字コードがJISの場合の16進コード)
確認できないので確証はありませんが、問題なく動作する可能性もあります。
助かります。
しかし、それでも全てのメールが転送されてしまいます。
英数字でも日本語でも全て転送されてしまいます。
なぜでしょうか…
また何かわかりましたら教えて頂けると幸いです。
解決した際にはお礼に100ポイントを送信させていただきます。
メールヘッダーはこんな感じです。
Return-Path : <***@docomo.ne.jp>
Received : from docomo.ne.jp (mail.docomo.ne.jp [203.138.203.195]) by www.sakura.ne.jp (8.13.6/8.13.6) with ESMTP id mABHko09095 for <info@***.sakura.ne.jp>; Wed, 12 Nov 2008 01:17:01 +0900 (JST) (envelope-from ***@docomo.ne.jp)
Date : Wed, 12 Nov 2008 01:17:00 +0900 (JST)
From : ***@docomo.ne.jp
To : info@***.sakura.ne.jp
Subject :
Message-Id : <IMTX0q3D104983950aJC@docomo.ne.jp>
Mime-Version : 1.0
Content-Type : text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding : 7bit
http://support.sakura.ad.jp/support/manual/rs/setmail_c.shtml
もし転送の設定をしているのでしたら、解除してから試してみてください。
それでもすべてのメールが転送される場合は、現在.mailfilterに記述されている内容を教えていただけたらと思います。
不都合のある部分は*などで隠してください。
大してアドバイスできないかもしれませんが、よろしくお願いします。
コントロールのメール管理で転送設定はしていません。
ですが全て転送されてしまいます…
.mailfilterの内容は
if ( /^(C|c)ontent-(T|t)ype:.*charset=.*(ISO|iso)-2022-(JP|jp).*/)
{
if ( /.*\x24\x4f\x24\x46\x24\x4a.*/:b )
{
cc "!postmaster@***\.sakura\.ne\.jp"
これです。はてなを本文に入力してもしなくても転送されてしまいます。
特定の文字列を英数字にした場合は
if ( /^(C|c)ontent-(T|t)ype:.*charset=.*(ISO|iso)-2022-(JP|jp).*/)
{
if ( /.*abcde.*/:b )
{
cc "!postmaster@***\.sakura\.ne\.jp"
です。
どこか記述が間違っていますでしょうか?
「}」は省略しただけですよね?
現在は、以下または特定の文字列を英数字にした場合の記述以外、他には何も記述されていないのでしょうか?
if ( /^(C|c)ontent-(T|t)ype:.*charset=.*(ISO|iso)-2022-(JP|jp).*/)
{
if ( /.*\x24\x4f\x24\x46\x24\x4a.*/:b )
{
cc "!postmaster@***\.sakura\.ne\.jp"
}
}
これしか記述されていない場合、マッチしない時は転送されないはずです。
コントロールパネルでの転送設定もしていないのでしたら、やはり他の記述にマッチしていて、そのためすべてのメールが転送されているのではないかと思います。
.mailfilterの記述内容を順番を変えずにそのままコピーした物をお願いします。
(※もちろん記述の一部を*で隠しても大丈夫です。)
「}」を省略していました汗。実際には記述しています。
それでもやはり全て転送されてしまいます。
.mailfilterの記述内容は以下が全てです。
if ( /^(C|c)ontent-(T|t)ype:.*charset=.*(ISO|iso)-2022-(JP|jp).*/)
{
if ( /.*abcde.*/:b )
{
cc "!postmaster@***\.sakura\.ne\.jp"
}
}
abcdeを含む本文を転送したいのですが、全て転送されてしまいます…
また何かわかりましたら教えて頂けると幸いです。
すみませんが、まったく分かりません…。
.mailfilterの最後の行にexitという記述はありますか?
パーミッションが600になっているかも確認してください。
上記が問題ない場合は、.mailfilterの記述を全部削除して、その状態でどうなるか確認してみてください。
デフォルトの.mailfilterをバックアップしている場合は、そちらに戻すとどうなるかも確認してみると良いです。
※メールアカウントごとに.mailfilterがあるそうですが、編集する.mailfilterを間違えていませんよね?
後は、例えばドコモからのメールを転送しない設定にして、.mailfilterがきちんと動作しているか確認するのも良いと思います。
if ( /^Received *:.*.docomo.ne.jp/:h )
{
exit
}
※他のルールを削除するか、あるいは上記のルールを一番上に記述します。
※Receivedの直後に「 」(半角スペース)を入れるのを忘れないでください。
通常は「Received:~」のはずですが、提示されたヘッダでは「Received :」となっていたので…。(ドコモだけでしょうか…?)
「Content-Type:」も「Content-Type :」のようですね。
.mailfilterが機能していることを確認できたら、今度は以下のように記述してみてください。
(※Content-Typeの後ろにスペースがあるかないかだけの違いで、両方にマッチします。)
if ( /^(C|c)ontent-(T|t)ype *:.*charset=.*(ISO|iso)-2022-(JP|jp).*/)
{
if ( /.*abcde.*/:b )
{
cc "!postmaster@***\.sakura\.ne\.jp"
}
}