Postfix - patch

私が作成した Postfix のパッチ達です。

MySQL Default File Patch

MySQL 形式のルックアップテーブル使用時に、my.cnf を参照できるようにするためのパッチです。 これにより、「default-character-set」や「connect-timeout」等が指定できるようになります。 このパッチを適用すると、次のパラメータが使用できるようになります。

パラメータ 説明
default_file my.cnf の代わりに使用するファイル名。 mysql_options() の MYSQL_READ_DEFAULT_FILE オプションと同じです。
default_group my.cnf 中のグループ名。 これを指定してもしなくても [client] グループのパラメータは参照されます。 mysql_option() の MYSQL_READ_DEFAULT_GROUP オプションと同じです。

次のように使用できます。

main.cf
smtpd_client_restrictions = mysql:/etc/postfix/client_access.mysql
client_access.mysql
default_group = hoge
query = select 〜〜 from 〜〜
/etc/my.cnf
[hoge]
default-character-set = ujis
connect-timeout = 15
user = username
password = password_for_username
database = dbname

初版には my.cnf ファイルで password パラメータが設定できない問題がありました。

smtpd Received Header Patch 2

Postfix の smtpd が生成する Received ヘッダを任意の形式に変更できるようにするパッチです。

パラメータ 説明 デフォルト値
smtpd_received_header_name Received へッダ名。空にすると Received 行を出力しない。 Received
smtpd_received_header_format Received へッダの形式。 実際のへッダは、ここで指定した文字列の後ろに「;\n\t日付情報」が付加される。 $received_from$lf$tab$received_by $received_with $received_id$lf$tab$received_for
smtpd_received_from クライアント情報。 smtpd_received_header_format の $received_from を置換する内容。 from $helo_name ($name [$addr])
smtpd_received_by 自ホスト名情報。 smtpd_received_header_format の $received_by を置換する内容。 by $myhostname
smtpd_received_with プロトコル情報。 smtpd_received_header_format の $received_with を置換する内容。 with $protocol
smtpd_received_id キューID情報。 smtpd_received_header_format の $received_id を置換する内容。 id $queue_id
smtpd_received_for 受信者情報。 smtpd_received_header_format の $received_for を置換する内容。 for <$recipient>

これらのパラメータ(smtpd_received_header_name を除く)中で指定できる文字列中には次のキーワードが指定できます。

キーワード 意味
$received_from smtpd_received_from の内容。 smtpd_received_header_format 中でのみ指定可
$received_by smtpd_received_by の内容。 smtpd_received_header_format 中でのみ指定可
$received_with smtpd_received_with の内容。 smtpd_received_header_format 中でのみ指定可
$received_id smtpd_received_id の内容。 smtpd_received_header_format 中でのみ指定可
$received_for smtpd_received_for の内容。 smtpd_received_header_format 中でのみ指定可。 受信者アドレスが複数の場合は空文字列になる
$tab タブ文字
$lf LF文字(改行)
$helo_name クライアントがHELO/EHLOで指定した名前。指定されなかった場合は $name と同じ
$name クライアントのIPアドレスを逆引きして得られたホスト名
$addr クライアントのIPアドレス
$myhostname main.cf の myhostname
$mail_name main.cf の mail_name
$protocol 「SMTP」または「ESMTP」
$queue_id キューID
$time 日時
$sender 送信者メールアドレス
$recipient 受信者メールアドレス

smtpd Received Header Patch

Postfix の smtpd が生成する Received ヘッダを任意の形式に変更できるようにするパッチです。

エンベロープ受信者が複数の場合に Received へッダが出力されなかったので修正しました(2004/01/13)。

改行コードは CR LF じゃなくて LF じゃないといけなかったようなので修正しました (2003/12/24)。

このパッチを適用すると、main.cf に smtpd_received_header_format と smtpd_received_header_format_one が指定できるようになります。これらで Received ヘッダの形式を指定できます。「Received:」も含める必要がありま す。smtpd_received_header_format_one は受信者アドレスが1つの時に適用 されます。各パラメータ中では、次のキーワードが指定できます。

キーワード 意味
$tab タブ文字
$lf LF文字(改行)
$helo_name クライアントがHELO/EHLOで指定した名前。指定されなかった場合は $name と同じ
$name クライアントのIPアドレスを逆引きして得られたホスト名
$addr クライアントのIPアドレス
$myhostname main.cf の myhostname
$mail_name main.cf の mail_name
$protocol 「SMTP」または「ESMTP」
$queue_id キューID
$time 日時
$sender 送信者メールアドレス
$recipient 受信者メールアドレス

パラメータのデフォルト値は次の通りです。パッチを適用しなかった時 と同じはずです。

smtpd_received_header_format = Received: from $helo_name ($name [$addr])$lf${tab}by $myhostname ($mail_name) with $protocol$lf${tab}id $queue_id; $time
smtpd_received_header_format_one = Received: from $helo_name ($name [$addr])$lf${tab}by $myhostname ($mail_name) with $protocol id $queue_id$lf${tab}for <$recipient>; $time

log_header Patch

任意のヘッダをログに出力するパッチです。

このパッチを適用すると、main.cf に log_header パラメータを指定で きるようになります。log_header パラメータで指定したヘッダの内容 をログに出力します。

[main.cf]
log_header = from, subject

MySQL direct_query Patch

Postfix 2.2.x では標準で同等の機能があるため、このパッチは必要ありません。

Postfix は MySQL 形式のルックアップテーブルを使用でき、さまざま なデータの検索に MySQL データベースを使用することができます。で すが、生成されるクエリは次の形式で固定となっています。

select select_field from table where where_field = 'key' additional_conditions

たいていの場合はこれでも困らないのですが、たとえば key を LIKE でマッチングさせたり、クエリ中に key を複数使うことはできません。 そこで、設定ファイル中に直接クエリを記述できるようにしました。こ のパッチを適用すると、設定ファイル中に次のように記述できるように なります。「${key}」部が検索キーに置き換わります。「${key}」はク エリ中に何度も記述できます。

direct_query = select xxxx from tttt where zzzz = '${key}'

これにより、検索キーを加工した検索や、複数テーブルの join も自由 自在です(なんと、select だけでなく、delete や insert も記述でき ます。そんなことしても意味があるとは思えませんが…(^^;)。

direct_query 指定時は、select_field, table, where_field, additional_conditions は無視されます。direct_query が指定されて いない場合は、従来通りに振る舞います。

SMTP Connect Patch

Postfix 1.x では、transport_maps で次のようにすることで、特定のドメイン宛の SMTP 配送先に複数のアドレスを記述することができました。

hoge.example.com              smtp:[192.168.xx.xx],[192.168.yy.yy]

これは組織内のスタティックな配送で冗長化するためにとても便利だったのですが、Postfix 2.0 からはできなくなってます。 ドキュメント(RELEASE_NOTE)によると、

[Incompat 20020917] The relayhost setting now behaves as documented, i.e. you can no longer specify multiple destinations.

ということなので、できていたのが間違いだったということなんでしょうが、これができないのはとても不便です。

…ということで、Postfix 2.x で 1.x と同様の処理を行なうためのパッチを作りました。

smtpd check_all_access Patch

Postfix 2.1 以降では、アクセスポリシー機能を使えば同等のことが実現できます。

Postfix の smtpd は、クライアントIP, エンベロープメールアドレス などで細かくアクセス制御が可能です。ですが、複数の条件を指定する ことができません。そのため、クライアントIPと送信者アドレスの両方 を指定したアクセス制御ができません(できても複雑になります)。

このパッチを適用して、smtpd_recipient_restrictions 中で check_all_access 制限を指定できるようになります。これはルックアッ プテーブルを引数とし、テーブルの検索キーは、クライアントIP, HELO/EHLO名, エンベロープFROM, エンベロープTO を「:」で連結した ものになります。

実際には、dbm や hash では使えないと思います。regexp を使用する ことになるでしょう。また、下の MySQL direct_query Patch を適用し た mysql テーブルでも使用できると思います。

たとえば、次のように設定します。クライアントのIPアドレスと、エン ベロープFROM がテーブル上に存在する場合にのみメール中継を許可す る例です。

[main.cf]
smtpd_recipient_restrictions = check_all_access mysql:/etc/postfix/all_access.cf reject

[all_access.cf]
user = xxxx
password = xxxx
dbname = xxxx
direct_query = select 'OK' from access_table where ip=substring_index('$key',':',1)
 and sender=substring_index(substring_index('$key',':',-2),':',1)

Dict MySQL Patch

Postfix は MySQL 形式のルックアップテーブルを使用でき、さまざま なデータの検索に MySQL データベースを使用することができます。で すが、複数の MySQL テーブルを指定すると、同じ接続パラメータでも テーブルの数だけ MySQL にコネクションが張られてしまいます。

…ということで、接続パラメータが同じ場合には同じ接続を共有するよ うに動作するパッチを作りました。

…でも、2.x 系では proxymap を使えばいいことが判明したので、この パッチは意味がありません… (;_;)


tommy@tmtm.org
Last modified: Mon Dec 18 03:31:01 JST 2006