Postfix で MariaDB(MySQL) を使う
Postfix で あるデータを共有したい場合や、変化しやすいデータを設定データに利用したい場合は、 MariaDB(MySQL) を利用した方が簡単だ。
ただし、ネットマスクや正規表現を用いた方が楽な場合もあるので、それらを考慮しながら導入するのが良いだろう。
インストール
Postfix 用のMySQL モジュールをインストールする。
sudo dnf install postfix-mysql |
テンプレート
user = データベースの接続ユーザー password = データベースの接続パスワード hosts = データベースが存在するサーバーアドレス dbname = サーバ上のデータベース名 query = SQL 文 |
※ 「hosts」には「127.0.0.1」のアドレスや「unix:/var/lib/mysql/mysql.sock」などのソケットファイルの指定も可能です。
※ SQL 文は、使用する項目によって異なります。コチラのサイトが非常に参考になります。種類の多さならコチラのサイトが参考になります。
※ 適応するパラメーターが ACCESS(5) に準拠している場合は、コチラをご覧ください。
※ 「postfix-mysql」についてはコチラのサイトを参考にして下さい。
※ 「postfix-mysql」は該当する項目があれば、何か(特に指定されていないが肯定を表す文字列)を返し、無ければ何も返さない様にします。ただし、エイリアスなどは元となるメールアドレスを返すのが適切です。
※ テンプレートのファイル名は「mysql-*.cf」(*は任意の文字列)で記述する事が多いです。
SQL 文
SQL 文には MariaDB(MySQL) の文字列操作関数なども使用可能である。 寧ろ文法にさえ従っていればかなり自由度の高い文章を作成する事が出来る。
入力パラメータは詳しくはコチラのサイトを参考にしてもらいたいが、「%s」が入力パラメータ全体、入力パラメータがメールアドレス形式である場合は「%u」がユーサー名、「%d」がドメイン名になる。
入力パラメータがメールアドレス形式である場合、「%s」は「CONCAT( ‘%u’, ‘@’, ‘%d’ )」と同等になる。
※ CONCAT( ‘%u’, ‘@’, ‘%d’ ) は 「’%u@%d’」と書いても同じである。
※ 勿論、FROM 文に複数のテーブルを使用する事も可能だし、UNION 文なども使用できる。ただし場合によっては DISTINCT 文などの使用も検討した方が良い。
作成する SQL 文には、大きく分けて2つの種類が存在する。
- 許可を与える SQL 文
- local_recipient_maps など。 この場合、受取を「許可」するかどうかの問題なので、「’OK’」「’ACCEPT’」「1」などを返しても問題はない。
※ 「拒否」したい場合は、何も返さないのが正解である。
※ 否定を表す文字列などを返した場合の動作は保証されていない。「’NO’」「’NG’」「’DENY’」「0」は返すべきではない。
※ コチラのサイトでは「select 1 from …」の形式が非常に多いですが、それらは全て「肯定」を表しています。
- local_recipient_maps など。 この場合、受取を「許可」するかどうかの問題なので、「’OK’」「’ACCEPT’」「1」などを返しても問題はない。
- 代替文字列を与える SQL 文
- alias_maps など。 この場合、エリアスの元となったメールアドレスを返すべきである。
適応
作成した local_recipient_maps 用のファイルを仮に「/etc/postfix/mysql-recipients.cf」に格納したとします。
このファイルを「/etc/postfix/main.cf」の「local_recipient_maps」に反映させます。
local_recipient_maps = mysql:/etc/postfix/mysql-recipients.cf |
編集し終えた後に、Postfix を再起動します。
sudo systemctl restart postfix |
テスト
MySQL の記述が正しく行われているかどうかのテストを行います。
# # データベースにある場合 # postmap -q hoge@hoge.com mysql:/etc/postfix/mysql-recipients.cf ACCEPT # # データベースに無い場合 # postmap -q abc@hoge.com mysql:/etc/postfix/mysql-recipients.cf # |
うまく動作している事が確認できました。