正木です。 誤って直接送ってしまいました。失礼しました。 入り口がfetchmailでなるべく単純解を考えることにします。 私はRubyistなので、Rubyでいきます。 まず、スクリプトを作ります。ここでは、外部Mutt(若干面倒がある)やsSMTP(古いパッケージしかない)に頼らない方向にします。 ヘッダの解析が問題です。エンコーディングをうまいこと処理してくれるライブラリがあるかもしれませんが、とりあえず手抜きします。 なお、もっとちゃんとやっているものはGitHubにおいてあります。 https://github.com/reasonset/maildeliver2 --- #!/usr/bin/ruby mail = ARGF.read header = mail.split(/\r\n\r\n|\n\n|\r\r/, 2).first to = header[/To:.*(?:^\s+.*$)*/] if to && to.downcase.include?("foo@bar.com") serv = Net::SMTP.new('some.smtp.server', 587) serv.enable_tls(OpenSSL::SSL::VERIFY_NONE) serv.start('host.name', 'user@example.com', 'password', :login) do |smtp| smtp.send_message(mail, "destination@example.com", "otheraddr@example.net") end else IO.popen(["rcvstore", "+inbox"], "r") {|io| io.write mail } end --- 外部コマンドとしてnmhのrcvstoreを使って直接MHメールボックスに対して保存しています。 それ以外の書き込みは、procmailに渡すなり、maildropに渡すなりすれば良いと思います。 多段化したいのであれば(clamavとbogofilterのために)スクリプト側で処理しても良いですし、 rcvstoreでなくprocmailに渡してもいいでしょう。 (その場合は、転送するメールはフィルタを経由しませんが) あとは、実行可能として.fetchmailrcでMDAとしてこれを指定します。 mda "/home/foo/bin/mymdascript.rb" ただし、この方法の問題は、Toアドレスで判断しているということです。 当該アカウントに対するメールであっても、Toが正しく書かれていなければ機能しません。 これを重視するのであれば、.fetchmailrcを使い分けることによって解決が可能です。 例えば、当該アカウントの時だけ HOME=/home/foo/forwardmail fetchmail のようにして、そこで指定したmdaによって問答無用で転送します。 この方法の問題は、転送によって同一のメールボックスに複数の宛先を集約している場合は望むように機能しないということです。 なお、スクリプトの動作確認はしておりません;-) You wrote:
正木さん
野宮です.
DMを有難うございます.
In the Message;
Subject : Re: [opensuse-ja] Re: メールを転送したい Message-ID : <20160312002557.96dd8c88d26f7fb056aaf8eb@reasonset.net> Date & Time: Sat, 12 Mar 2016 00:25:57 +0900
MASAKI Yuhsuke <hydrangea@reasonset.net> has written:
正木です。
どういう状況でどうしたいのかいまひとつ判然としませんが、MDAである procmailにいきなりメールが入ってくることはまずないでしょうから、転送 したいということはprocmailはあまり関係ないことになります。 入り口はPostfixかfetchmailのどちらかですね。
fetchmail です.
どちらも.forwardは理解しますが、Postfixにおいて.forwardを理解するの はmaildropであったように思います。 ということは、MDA->MDAに渡すメリットは少ないので(amavisdに渡すことは あるでしょうけれど)、それだったらPostfixの設定でmaildropでなく procmailを使うのが一般的ですね。
成る程.
fetchmailからであれば、procmailを使うために設定でMDAを指定するか、あ るいは.forwardで指定するのが一般的でしょう。 もし、入り口はfetchmailであり、なおかつ設定側でprocmailを呼んでいる のであれば、procmailを呼ばないようにする必要があります。
ここまでは解ります. 因みに、procmail では、clamav と bogofilter を噛ませています.
.forward、あるいはaliasesのパイプは任意のプログラムに渡せますから、 どのようにでもできます。 入り口がPostfixであるならば、aliasesで当該アドレスのものだけをスクリ プトに渡すようにすればいいでしょう。 スクリプトは単純にMuttあるいはsSMTPで外部のSMTPサーバーにメールを転 送し、配送を委譲します。 destinationが自身のアカウントであるならば、そのサーバーに届けるのが ベストでしょう。 なお、Postfixのaliasesはアドレスをお望みならRegExpやPCREでマッチでき ます。
朧気ながら、少し解ります.
.forwardを使うのであれば、スクリプト内で当該アドレスのものかどうかを判定し、 そうであればMuttあるいはsSMTPに渡し、そうでなければprocmailに渡すよ うにすれば良いでしょう。
スミマセン、ポイントがあればお教え下さい.スクリプトというのが、全く解 りません. それと、Mutt はともかく、sSMTP はopenSUSEパッケージは有りませんね? ソースをビルドしたり、src.rpm を公開している方のところから DL してビル ドを試みましたが、いずれも、libcrypt 絡みのエラーで蹴られました.
MH形式を使っているのであればnmhに渡すほうがいいでしょうし、emlで保存 するのならば単純に保存するほうが良いかもしれません。
MUA は、Wanderlust でメールは、MH 形式ですので、nmh に渡す、ということ になるのですね.
標準入力から入ったメールを判定のために消化してしまうことになりますが、 最も簡単な解決方法はスクリプトでまず標準入力をファイルとして保存して しまうことでしょう。
Postfixを経由するのであれば、そもそも転送される全てのメールがブロッ クされることになりますから、aliasesでスクリプトを書くよりは、全ての 送信メールを委譲することにしたほうが合理的でしょうけれど。
何か、凄く敷居が高く思われます.(^^;;
--- ┏━━┓彡 野宮 賢 mail-to: nomiya @ galaxy.dti.ne.jp ┃\/彡 ┗━━┛ 「先端技術の開発は、優れた頭脳を持つ人間が集中しないと成功しない。 しかし、技術開発と、それが何をもたらすかを考えることは別だ。 一人の人間に二つは望めない。」 -- M. Crichton -- -- To unsubscribe, e-mail: opensuse-ja+unsubscribe@opensuse.org To contact the owner, e-mail: opensuse-ja+owner@opensuse.org
野宮です. In the Message; Subject : Re: [opensuse-ja] Re: メールを転送したい Message-ID : <20160313113041.b1f608ee028f49f3400b3175@reasonset.net> Date & Time: Sun, 13 Mar 2016 11:30:41 +0900 MASAKI Yuhsuke <hydrangea@reasonset.net> has written:
正木です。 誤って直接送ってしまいました。失礼しました。
そういうことでしたか.
入り口がfetchmailでなるべく単純解を考えることにします。 私はRubyistなので、Rubyでいきます。
まず、スクリプトを作ります。ここでは、外部Mutt(若干面倒がある)や sSMTP(古いパッケージしかない)に頼らない方向にします。
ヘッダの解析が問題です。エンコーディングをうまいこと処理してくれるラ イブラリがあるかもしれませんが、とりあえず手抜きします。
なお、もっとちゃんとやっているものはGitHubにおいてあります。 https://github.com/reasonset/maildeliver2
後で、取得することとします.
--- #!/usr/bin/ruby mail = ARGF.read header = mail.split(/\r\n\r\n|\n\n|\r\r/, 2).first to = header[/To:.*(?:^\s+.*$)*/]
if to && to.downcase.include?("foo@bar.com") serv = Net::SMTP.new('some.smtp.server', 587) serv.enable_tls(OpenSSL::SSL::VERIFY_NONE)
serv.start('host.name', 'user@example.com', 'password', :login) do |smtp| smtp.send_message(mail, "destination@example.com", "otheraddr@example.net") end else IO.popen(["rcvstore", "+inbox"], "r") {|io| io.write mail } end ---
外部コマンドとしてnmhのrcvstoreを使って直接MHメールボックスに対して 保存しています。 それ以外の書き込みは、procmailに渡すなり、maildropに渡すなりすれば良 いと思います。
多段化したいのであれば(clamavとbogofilterのために)スクリプト側で処理 しても良いですし、rcvstoreでなくprocmailに渡してもいいでしょう。 (その場合は、転送するメールはフィルタを経由しませんが)
あとは、実行可能として.fetchmailrcでMDAとしてこれを指定します。
mda "/home/foo/bin/mymdascript.rb"
ただし、この方法の問題は、Toアドレスで判断しているということです。 当該アカウントに対するメールであっても、Toが正しく書かれていなければ 機能しません。 これを重視するのであれば、.fetchmailrcを使い分けることによって解決が 可能です。 例えば、当該アカウントの時だけ HOME=/home/foo/forwardmail fetchmail のようにして、そこで指定したmdaによって問答無用で転送します。 この方法の問題は、転送によって同一のメールボックスに複数の宛先を集約 している場合は望むように機能しないということです。
なお、スクリプトの動作確認はしておりません;-)
じっくり勉強することとします. どうも、有難うございます. --- ┏━━┓彡 野宮 賢 mail-to: m.nomiya @ gmail.com ┃\/彡 ┗━━┛ 「先端技術の開発は、優れた頭脳を持つ人間が集中しないと成功しない。 しかし、技術開発と、それが何をもたらすかを考えることは別だ。 一人の人間に二つは望めない。」 -- M. Crichton -- -- To unsubscribe, e-mail: opensuse-ja+unsubscribe@opensuse.org To contact the owner, e-mail: opensuse-ja+owner@opensuse.org
participants (2)
-
MASAKI Yuhsuke
-
野宮 賢 / NOMIYA Masaru