複数ドメイン対応のpostfix+dovecotを構成する
対象
postfixをマルチドメイン対応し、配送をdovecotへ委託する簡単なお仕事です。
ソフトウエア構成
このページで紹介する設定
注意点
拡張メールアドレスを使用できないように見えますが、「recipient_delimiter」をdovecotとpostfixの両方に設定することで使用可能になるそうです。
[Dovecot] LMTP with address extension
postfix
/etc/postfix/master.cf(差分)
ネットワークとホスト名の設定はいつものとおり。
最後のdovecot-lmtpとvirtual_mailbox_domains.cfが肝。
マルチドメインの場合、行き先がわからずbounceしてしまう。
そのため、virtual_mailbox_domains.cfで自分自身であることを明示的に示す。
diff main.cf.org main.cf 76a77 > myhostname = mailtest.home.lan 113c114 < #inet_interfaces = all --- > inet_interfaces = all 116c117 < inet_interfaces = localhost --- > #inet_interfaces = localhost 409c410 < #recipient_delimiter = + --- > recipient_delimiter = + 676a678,702 > > #dovecot_destination_recipient_limit = 1 > virtual_mailbox_domains = proxy:mysql:/etc/postfix/virtual_mailbox_domains.cf > virtual_mailbox_maps = proxy:mysql:/etc/postfix/virtual_mailbox_maps.cf > virtual_alias_maps = proxy:mysql:/etc/postfix/virtual_mailbox_maps.cf > virtual_transport = lmtp:unix:private/dovecot-lmtp > mailbox_transport = lmtp:unix:private/dovecot-lmtp > > > smtpd_sasl_type = dovecot > # Can be an absolute path, or relative to $queue_directory > # Debian/Ubuntu users: Postfix is setup by default to run chrooted, so it is best to leave it as-is below > smtpd_sasl_path = private/auth > # On Debian Wheezy path must be relative and queue_directory defined > #queue_directory = /var/spool/postfix > # and the common settings to enable SASL: > smtpd_sasl_auth_enable = yes > # With Postfix version before 2.10, use smtpd_recipient_restrictions > smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination > > smtpd_use_tls = yes > smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem > smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem > smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
- virtual_alias_maps
- 実装はサボっています
- 本来は転送先等を考慮した構成にすべきです
/etc/postfix/virtual_mailbox_domains.cf
ドメインの情報を拾ってくる。
スキーマは前回紹介したdovecotの構成を流用する。
user = postfix password = postfixpostfix hosts = 192.168.1.1 dbname = mailserver query = SELECT domain FROM domain WHERE domain='%s'
なお、上記設定のデバッグを行う場合は以下のコマンドを実行してデータが帰ってくるかを確認してください。
postmap -q mailtest.home.lan mysql:/etc/postfix/virtual_mailbox_domains.cf
/etc/postfix/virtual_mailbox_maps.cf
ドメインの情報を拾ってくる。
スキーマは前回紹介したdovecotの構成を流用する。
user = postfix password = postfixpostfix hosts = 192.168.1.1 dbname = mailserver query = SELECT email FROM mailbox WHERE email='%s' AND domain=substring_index( '%s', '@' , -1 )
なお、上記設定のデバッグを行う場合は以下のコマンドを実行してデータが帰ってくるかを確認してください。
postmap -q test@mailtest.home.lan mysql:/etc/postfix/virtual_mailbox_maps.cf
dovecot
/etc/dovecot/conf.d/10-master.conf
lmtp プロトコルを使用してメールの配信を行う。
diff /etc/dovecot/conf.d/10-master.conf.org /etc/dovecot/conf.d/10-master.conf -u --- /etc/dovecot/conf.d/10-master.conf.org 2014-12-28 12:48:46.157639142 -0800 +++ /etc/dovecot/conf.d/10-master.conf 2014-12-28 20:58:16.179631631 -0800 @@ -46,9 +46,14 @@ } service lmtp { - unix_listener lmtp { - #mode = 0666 + unix_listener /var/spool/postfix/private/dovecot-lmtp { + group = postfix + mode = 0600 + user = postfix } + #unix_listener lmtp { + # #mode = 0666 + #} # Create inet listener only if you can't use the above UNIX socket #inet_listener lmtp { @@ -85,9 +90,12 @@ } # Postfix smtp-auth - #unix_listener /var/spool/postfix/private/auth { - # mode = 0666 - #} + unix_listener /var/spool/postfix/private/auth { + mode = 0660 + # Assuming the default Postfix user and group + user = postfix + group = postfix + } # Auth process is run as this user. #user = $default_internal_user
/etc/dovecot/conf.d/10-mail.conf
- 念のためmaildir形式であることを宣言しておく(本来不要)
- システムユーザー等でのログインを拒否する
- プラグインをロードするようにしておく
diff /etc/dovecot/conf.d/10-mail.conf.org /etc/dovecot/conf.d/10-mail.conf 24c24 < # mail_location = maildir:~/Maildir --- > mail_location = maildir:~/Maildir 167c167 < #first_valid_uid = 500 --- > first_valid_uid = 500 207c207 < #mail_plugins = --- > mail_plugins = quota autocreate
/etc/dovecot/conf.d/10-ssl.conf
diff /etc/dovecot/conf.d/10-ssl.conf.org /etc/dovecot/conf.d/10-ssl.conf 6c6 < #ssl = yes --- > ssl = yes 41c41,42 < #ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL --- > ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL:!SSLv3
/etc/dovecot/conf.d/20-lmtp.conf
- plugin等の設定を行う
- postmaster_addressは必須のため、設定すること。
diff /etc/dovecot/conf.d/20-lmtp.conf.org /etc/dovecot/conf.d/20-lmtp.conf 15c15,16 < #mail_plugins = $mail_plugins --- > mail_plugins = $mail_plugins > postmaster_address = postmaster@home.lan
テスト
メールを送信してみる
telnet localhost 25 HELO mailtest.home.lan MAIL FROM: test@mailtest.home.lan RCPT TO: root@mailtest.home.lan DATA This is testmail . QUIT
結果は以下のとおり
telnet localhost 25 Trying ::1... Connected to localhost. Escape character is '^]'. 220 mailtest.home.lan ESMTP Postfix HELO mailtest.home.lan 250 mailtest.home.lan MAIL FROM: test+extends@mailtest.home.lan 250 2.1.0 Ok RCPT TO: root@mailtest.home.lan 250 2.1.5 Ok DATA 354 End data with <CR><LF>.<CR><LF> This is testmail . 250 2.0.0 Ok: queued as E49AAC0DD0 QUIT 221 2.0.0 Bye Connection closed by foreign host.
maillogは以下のようになっていればOK。
Dec 28 12:33:53 localhost postfix/smtpd[17242]: connect from localhost[::1] Dec 28 12:34:07 localhost postfix/smtpd[17242]: E49AAC0DD0: client=localhost[::1] Dec 28 12:34:20 localhost postfix/cleanup[17254]: E49AAC0DD0: message-id=<20141228203407.E49AAC0DD0@mailtest.home.lan> Dec 28 12:34:21 localhost postfix/qmgr[17240]: E49AAC0DD0: from=<test+extends@mailtest.home.lan>, size=373, nrcpt=1 (queue active) Dec 28 12:34:21 localhost dovecot: lmtp(17257): Connect from local Dec 28 12:34:21 localhost dovecot: lmtp(17257, root@mailtest.home.lan): 1pEdCU1poFRpQwAAYLDy1w: msgid=<20141228203407.E49AAC0DD0@mailtest.home.lan>: saved mail to INBOX Dec 28 12:34:21 localhost postfix/lmtp[17256]: E49AAC0DD0: to=<root@mailtest.home.lan>, relay=mailtest.home.lan[private/dovecot-lmtp], delay=17, delays=17/0.05/0.06/0.04, dsn=2.0.0, status=sent (250 2.0.0 <root@mailtest.home.lan> 1pEdCU1poFRpQwAAYLDy1w Saved) Dec 28 12:34:21 localhost dovecot: lmtp(17257): Disconnect from local: Client quit Dec 28 12:34:21 localhost postfix/qmgr[17240]: E49AAC0DD0: removed Dec 28 12:34:23 localhost postfix/smtpd[17242]: disconnect from localhost[::1]
参考文献
- LDA/Postfix - Dovecot Wiki Dovecot LDA with Postfix(非推奨)
- LMTP - Dovecot Wiki LMTP (推奨)
- Dovecot でローカル配信する | volatile memory lmtpの解決に至る経緯についてのまとめ
- https://workaround.org/ispmail/lenny/postfix-database-mappings 設定およびデバッグについてのまとめ
- [Linux][postfix] postfix にてキューにたまったメールの削除方法 | [ま]技術雑記 送信テストを行う際にキューへ溜まっているものを削除する