フレッツADSL導入日誌
導入編 | ||
FreeBSDルーター編 | ||
ローカルDNSサーバー | ||
フレッツADSLで固定IP | ||
ドメイン取得とDNS運用 | ||
>>> | メールサーバー / remove-prepend-V2パッチ | |
Webサーバー |
10 Jun 2017 | 新規作成。 |
古いタイプ(qmail-localにパッチを当てるタイプ)、qmail-localとの戯れ方はこちらです。 remove-prepend for qmail
netqmail-1.06用のパッチです。
仮想ドメインを使ったときに-owner
アドレスに仮想ドメインプレフィックスがついてしまう不具合の修正を行います。
ついでに、virtualdomains vs. VERP and Delivered-Toのパッチも入ってます。
BEFORE using the following patch, READ preamble of the patch.
~user/.qmail
で転送を指示した場合に、~user/.qmail-owner
があると、表書き差出人がuser-owner@example.jp
の形に書き換えられます。
このアドレスは~user/.qmail-owner
の配送指示に従いますが、このファイルがあるからこのアドレスが生成されたので、必ず配送が可能です。
一方、user@virtual.domain
がcontrol/virtualdomains
に合致するとprepend-
プレフィックスが付けられて配送されます。
これはユーザーprepend
に配送され、~prepend/.qmail-user
の配送指示に従います。
もし、~prepend/.qmail-user
で転送が指示されていて、~prepend/.qmail-user-owner
が存在すると、表書き差出人はprepend-user-owner@virtual.domain
に書き換えられますが、このアドレスにメールを差し出すとcontrol/virtualdomains
によりさらにプレフィックスが付けられてしまい、prepend-prepend-user-owner@virtual.domain
宛に配送されることになります。
このアドレスは~prepend/.qmail-prepend-user-owner
の配送指示に従いますが、普通このようなファイルはありませんから、このメールは正しく配送されません。
また、prepend-
というのは一種の内部情報で、外に漏れて欲しくない場合もあるでしょう。
prepend-
を付けているのはqmail-sendです。
表書き差出人を書き換えているのはqmail-localです。
qmail-sendからqmail-localを呼び出すまでの間で、prepend-
を削ればより望ましい動作になるでしょう。
以前は一生懸命qmail-localで削除していましたが、このパッチではqmail-sendでprepend-
を付けるときに、内部では-
を:
にしておき、qmail-localを呼び出すまでの間で:
より前を削除することで実現しています。
qmail-localは削られたアドレスしか受け取らないので、Delivered-To:
ヘッダフィールドにもprepend-
を削ったアドレスが出力されます。
.qmailから起動されるコマンドに渡される環境変数NEWSENDER
・LOCAL
・RECIPIENT
も、prepend-
を削ったものが渡されます。
LOCAL
・RECIPIENT
については以前のバージョンと動作が異なりますので注意してください。
制御ファイルは使用しません。 コロンが特殊文字扱いになりますが、変えたい人はビルドする前にvdom-sep.hの中身を書き換えてください。
副作用として、ログファイルへの受取人アドレスの出力で、prepend-
の最後のハイフンがコロンになります。
また、prepend-
がない場合も、先頭にコロンが付きます。
このパッチを当てなくても、~prepend/.qmail-user
でqmail-injectの-fオプションで表書き差出人アドレスを差し替えれば解決します。
複数の宛先に転送したい場合は、qmail-injectで表書き差出人アドレスを書き換えた上で配送用のローカルなアドレスにメールを投げ、そのアドレスに転送先のアドレスを並べればOKです。
要するにメーリングリストと同じ要領です。
qmail-sendがキューからメールを取りだすと、まず、rewrite
関数でlocals
とvirtualdomains
にヒットするかどうかを調べます。
locals
にヒットすればそのままローカル配送、virtualdomains
にヒットすればアドレスの前にprepend-
を付加してローカル配送、それ以外の場合はそのままリモート配送になります。
このとき、virtualdomains
にヒットした場合に付加するprepend-
を、後ろをコロンにしてprepend:
にします。
その他の場合は先頭にコロンを付けておきます。
これでprepend
それ自身にハイフンが含まれていても、どこまでがprepend
かはっきり分かります。
また、先頭がコロンならばprepend
がないこともすぐに分かります。
続いて、qmail-lspawnあるいはqmail-rspawnに対して、パイプ経由でコマンドが渡ります。
このふたつのプログラムは構造がちょっと特殊で、main関数がどちらもspawn.cの中にあり、そこからspawn
関数を呼び出すようになっています。
この関数がqmail-lspawn.cとqmail-rspawn.cの中にあり、どちらをリンクするかで実際の動作が決まるようになっています。
で、spawn.cのdocmd
でそれぞれのspawn
関数を呼び出しているため、この部分はlspawnとrspawnで処理が共通になっていないと面倒です。
先ほど、リモート配送の場合も先頭にコロンを付けていましたが、それはdocmd
関数がローカルとリモートで共通になっているからです。
spawn
関数を呼び出すときにprepend
の後ろのコロンをハイフンに戻し、さらに、今までの引数に追加してprepend-
の文字数をspawn
関数に渡します。
これで簡単にprepend-
を外すことができます。
qmail-lspawnではnughde_get
関数(name, uid, gid, home, dash, ext、のことらしい)で配送先ユーザーを決めていますが、ここではコロンをハイフンに置き換えた(prepend-
を外す前の)受取アドレスを使います。
最終的にspawn
関数からqmail-localあるいはqmail-remoteをexec
しますが、コマンドラインを作るときにprepend-
を外してしまいます。
これでqmail-localにはprepend-
がやって来ませんから、Delivered-To:
も環境変数も、転送時のownerも、一切prepend-
が付くことはありません。
qmail-remoteはprepend-
は関係ないのですが、先ほど説明したように、spawn
関数の呼び出し側がlocalと共通になっているので、qmail-localと同様にprepend-
を外すコードを一応入れてあります。
prepend-
がなければコロンは外された状態で飛んでくるので放っておいても大丈夫なはずですが。
なお、バウンスを発生させるときはqmail-sendがprepend-
を外しています。
この時に呼び出すstripvdomprepend
も何かごちゃごちゃやっていますが、prepend
のデリミタをコロンに変えてしまったので、ばっさり書き換えてあります。
Copyright (C) 2017 You SUZUKI
$Id: remove-prepend-v2.htm,v 1.4 2018/10/27 05:39:36 you Exp $