私が作成した Postfix のパッチ達です。
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 オプションと同じです。 |
次のように使用できます。
smtpd_client_restrictions = mysql:/etc/postfix/client_access.mysql
default_group = hoge query = select 〜〜 from 〜〜
[hoge] default-character-set = ujis connect-timeout = 15 user = username password = password_for_username database = dbname
初版には my.cnf ファイルで password パラメータが設定できない問題がありました。
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 | 受信者メールアドレス |
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
任意のヘッダをログに出力するパッチです。
このパッチを適用すると、main.cf に log_header パラメータを指定で きるようになります。log_header パラメータで指定したヘッダの内容 をログに出力します。
例
[main.cf] log_header = from, subject
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 が指定されて いない場合は、従来通りに振る舞います。
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 と同様の処理を行なうためのパッチを作りました。
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)
Postfix は MySQL 形式のルックアップテーブルを使用でき、さまざま なデータの検索に MySQL データベースを使用することができます。で すが、複数の MySQL テーブルを指定すると、同じ接続パラメータでも テーブルの数だけ MySQL にコネクションが張られてしまいます。
…ということで、接続パラメータが同じ場合には同じ接続を共有するよ うに動作するパッチを作りました。
…でも、2.x 系では proxymap を使えばいいことが判明したので、この パッチは意味がありません… (;_;)