.forwardで、特定のメールだけ(or以外)を転送するには?

[上に] [前に] [次に]
いそぎんちゃく [E-Mail] [HomePage] 1998/01/06(火) 18:42:28
 UNIXサーバに.forwardファイルを設定すれば、メールを転送できますが
着信した全てのメールを転送するのではなく「ある特定のメールだけ」転送す
るにはどうしたら良いのでしょうか?
 また、「特定のメール以外を転送」というのもあれば便利なのですが…。

 なんとか、Subjectや発信者名などで上記のような技ができませんかねぇ

飯塚 [E-Mail] [HomePage] 1998/01/06(火) 23:45:36
(1) .forwardに、以下のように書く。
   "| my_cmd"
(2) .forwardと同じディレクトリに、my_cmdというプログラム
   を作る。言語はPerlなどで良い。
   処理内容は、「標準入力から読み込まれるメールのヘッダなど
   を調査し、特定のメールならばsendmailコマンドでそのまま
   転送する」というものになる。
という方法でできると思います。
あと、サーバ全体の環境設定をできる立場なら、.forwardだけで
上記のことができるそうです。

いそぎんちゃく [E-Mail] [HomePage] 1998/01/07(水) 12:15:54
 あの…。ワタシCGIにはそんなに詳しくないので
具体的にどういう内容にしたらイイかも教えてもらえ
ないでしょうか…。

片松 祐司 [E-Mail] 1998/01/12(月) 23:16:03
飯塚さんへ
  ・転送する場合
    標準入力 -> sendmail
  ・転送しない場合
    標準入力 -> 標準出力
でよいのでしょうか?
私も興味あります。詳しく教えてください。

B-Cus 1998/01/12(月) 23:48:52
> あの…。ワタシCGIにはそんなに詳しくないので

とりあえずこれはCGIではありません。WWWサーバから実行される
わけではないからです。

メールがスプールにたまっている場合のファイルの形式を見たことは
ありますか?

From: ...
Received: ...
Received: ...
Received: ...
Date: ...
From: ...
Message-ID: ...
To: ...
Subject: ...
Content-Length: 本文の長さ
(空行。これより以前がヘッダ。これより後は本文)
本文

こんな感じになっているはずです(順番は違うかも)。これが
標準入力から流れてきますので、その内容に従って処理を
すればいいわけです。


ホームディレクトリに.forwardというファイルを作って

|IFS=''&&exec /usr/local/bin/perl /users/mail-delivery.pl||exit 75

と書いてください(この書き方に関してはよくわかりません。sendmail.cfの書式?)。

で、/users/mail-delivery.plは以下のように書いてください。
# /usersは自分のホームディレクトリに置き換えてください

----------------------------
#!/usr/local/bin/perl

$mail_spool = "/var/mail/ユーザ名";
# あるいは /var/spool/mail/ユーザ名
# あるいは /usr/spool/mail/ユーザ名 などなど…自分のスプール

while (<STDIN>){
 $content .= $_;

 m/^Content-Length: (\d+)$/;
 if ( $1 > 100000 ){ exit; }
 if ( m/^Subject: ANY SUBJECT$/ ){ $send="foo@bar.com"; }
 if ( m/^From: ANY PERSON$/ ){ $send="any@any.com"; }

 if ( m/^$/ ){  # 本文は調べない
  while (<STDIN>){
   $content .= $_;
  }
 }
}

if ( $send ne "" ){
 open(SENDMAIL,"|/usr/bin/mail $send");
 print SENDMAIL $content;
 close(SENDMAIL);
} else {
 print $content >> $MAIL_SPOOL;
}
-----------------------------

メールの100KB以上なら捨てます。
サブジェクトがANY SUBJECTなら foo@bar.comにメールを送ります。
ANY PERSONから届いたメールなら any@any.comにメールを送ります。
それ以外ならメールスプールに追加します。


このスクリプト動作確認はしていません。
昔似たようなことをした記憶に従って書きました。

あと、くれぐれも試すときは メーリングリストなどからは脱退して
行ってください。変なメールがMLに流れないという保証は
できませんので。

B-Cus 1998/01/12(月) 23:59:08
すいません、上のを書き込んだら、日付と送信者のところが
...となってindexの一番下に移動してしまいました。

これって僕が何か変なことしたんでしょうか?(x_x)

B-Cus 1998/02/04(水) 16:30:43

だいぶ前に上の方法で家のFreeBSDではうまくいったのですが、
先日学校のSolarisでやってみるとうまくいかなかったです。

~/.forward
----------------
|IFS=''&&exec /usr/local/bin/perl /home/b-cus/mail-delivery.pl||exit 75
----------------

~/mail-delivery.pl
----------------
open(OUT,">>/home/b-cus/sample");
while (<STDIN>){
  print OUT $_;
}
close(OUT);
----------------

として、とりあえずセキュリティは無視して、

chmod 755 ~/.forward
chmod 755 ~/mail-delivery.pl
chmod 666 ~/sample

としたのですが、sampleには何も追加されません。


これが原因では?、というものはありますでしょうか。

ぼん [E-Mail] 1998/02/05(木) 14:57:29
このような目的で実績のある procmail を使うのがいいのでは?

この名前でgooなどの検索サーバで適当に調べてみましょう。
結構引っかかります。

とほほ 1998/02/06(金) 00:53:26
ホームページ作成関連ではないので、ちょっと・・・・ですが、
.forward ファイルって、600 とかのパーミッションにしてお
かなくてはならないとかの制限(セキュリティのため)ってな
かったでしたっけ? (うろ覚えですが・・)

B-Cus 1998/02/07(土) 04:03:36
> .forward ファイルって、600 とかのパーミッションにしてお
> かなくてはならないとかの制限(セキュリティのため)ってな
> かったでしたっけ? (うろ覚えですが・・)

あ〜そういえば聞いたことがあるような。
というわけでやってみたんですが症状は変わらず…でした。

> このような目的で実績のある procmail を使うのがいいのでは?

実際にメール振り分けをしなければいけない状況だと
そうしますが、ただ単にSolarisでもできるかな〜と
思っただけなんで(^^;

もうちょっとがんばってみます。

ぼん [E-Mail] 1998/02/08(日) 00:38:34
私はあまり詳しくないのですが、メールの処理量が増えてくると
ロックの制御をちゃんとしておかないとメールがロストする場合
も考えられないですか?実績のないスクリプトを教えても逆に迷惑
になるだけだと思いますが。

導入が簡単なものでperlのスクリプトで書かれているSMMSと言う物
もありますが、やはり信頼性に関しては後一歩の所のようなので
これは奨めずprocmailを奨めたのです。(私はSMMSで小規模MLを運営
していたこともあります。)

匿名希望 1998/03/26(木) 07:28:31


[上に] [前に] [次に]