とりあえずこんな設定を書いた。単純にMySQLを使ってエイリアスの設定を取得する的な。
# cat /etc/postfix/mysql_virtual_alias_maps.cf user = postfix password = PASSWORD hosts = localhost dbname = postfix table = alias select_field = goto where_field = address
しかしメールを送るとMySQLに接続できないとコケる。
Oct 7 00:01:02 localhost postfix/cleanup[26321]: warning: connect to mysql server localhost: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) Oct 7 00:01:02 localhost postfix/cleanup[26321]: warning: mysql:/etc/postfix/mysql_virtual_alias_maps.cf lookup error for "test@nogisawa.net" Oct 7 00:01:02 localhost postfix/cleanup[26321]: warning: A05B0C0CDF: virtual_alias_maps map lookup problem for test@nogisawa.net -- message not accepted, try again later
ネットワークが何かおかしい?ソケットにしたらどうかな?という事でソケットにしてみる。
# cat /etc/postfix/mysql_virtual_alias_maps.cf (略) hosts = unix:/run/mysqld/mysqld.sock (略)
もちろんソケットはちゃんとある
# ls -la /run/mysqld/mysqld.sock srwxrwxrwx 1 mysql mysql 0 Sep 13 11:42 /run/mysqld/mysqld.sock
再起動してログを眺めると・・・
Oct 7 00:05:39 localhost postfix/cleanup[26559]: warning: connect to mysql server unix:/run/mysqld/mysqld.sock: Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2) Oct 7 00:05:39 localhost postfix/cleanup[26559]: warning: mysql:/etc/postfix/mysql_virtual_alias_maps.cf lookup error for "test@nogisawa.net" Oct 7 00:05:39 localhost postfix/cleanup[26559]: warning: A38ACC0CDF: virtual_alias_maps map lookup problem for test@nogisawa.net -- message not accepted, try again later
コケた。そういえばpostfixってchrootしてるんだっけ。見えないじゃん。
root@localhost:/etc/postfix# cat /etc/postfix/master.cf (略) # ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (no) (never) (100) # ========================================================================== smtp inet n - y - - smtpd
という事でネットワーク経由に戻す。今度はlocalhostではなくIPアドレス。
root@localhost:/etc/postfix# cat /etc/postfix/mysql_virtual_alias_maps.cf (略) hosts = 127.0.0.1 (略)
再起動してメールを投げてみると・・・
Oct 7 00:08:48 localhost postfix/virtual[26771]: D248BC0CDF: to=<test@nogisawa.net>, relay=virtual, delay=0.01, delays=0.01/0/0/0, dsn=2.0.0, status=sent (delivered to maildir) Oct 7 00:08:48 localhost postfix/qmgr[26764]: D248BC0CDF: removed
おお、今度はちゃんと行った。名前が解決できないのか・・・なぜだ・・・。
それとパーミッションは下記のようにしないと怒られる模様。
# ls -la mysql_virtual_alias_maps.cf -rw-r----- 1 root postfix 130 Oct 7 00:08 mysql_virtual_alias_maps.cf
最初root:rootで600とかやってたら怒られた。まぁ、warningが出るだけで使える気もするけど・・・。
localhostだとNGなのに127.0.0.1はOKなのがいまいち納得できないので色々調べてみました。で、ふと気づきました。
# netstat -lnp | grep mysql tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 850/mysqld
# cat /etc/hosts | grep localhost 127.0.0.1 localhost 127.0.1.1 localhost ::1 localhost ip6-localhost ip6-loopback
勘の良い人はおわかりと思いますが、これは単純にMySQLがIPv4でしかLISTENしていなくて、localhostはIPv4(127.0.0.1)とIPv6(::1)の両方が定義されていて、postfixはIPv6の::1の方に接続に行っている…という話でした。