概要
3000人程度の利用者に対するメールシステムを、かれこれ12年間、オンプレミスで運用してきたのですけれど、ついに G Suite に移転することになりました。その間に得たノウハウを、このままロストテクノロジーにするのも惜しいので、過去の作業ログの中から、ある程度汎用性がありそうなトピックを取り出して、公開しようと思います。
近年、卒業・退職した利用者に対して大学からコンタクトをとる必要性1から、構成員に対して生涯メールアドレスを発行するように、大学本部から要請されるケースが増えています。しかし、卒業・退職した利用者のメールボックスも維持していると、メールボックス用ストレージの残容量が速攻で破綻します。
そこで、折衷案として、卒業・退職した利用者に対しては、メールの転送のみを行い、メールボックスの提供はしない、という運用を行なってきました。本稿では、そのための設定手順を紹介します。
前提
幾つかの前提があります。
- SMTP は Postfix で処理している。
- IMAP/POP3 は Dovecot で処理している。
- ローカルなメールボックスへの配送(Postfix → Dovecot)は、LMTP で行う。
- ユーザによる転送先設定は LDAP に格納されている。
設定内容
設定の基本的な方針は、以下の2段階からなります。
- 全利用者宛のメールを転送またはメールボックスに配送する。
- メールボックスに配送する時点で、卒業・退職済み利用者宛のメールを破棄する。
これにより、卒業・退職済み利用者については、転送のみを行なって、メールボックスへの配送は行わない、という挙動になります。
全利用者宛のメールを転送またはメールボックスに配送する
基本的な設定は、以下の通り。
mydomain = example.jp
mydestination = $myhostname, $mydomain
alias_maps = ldap:/etc/postfix/forward.cf
転送設定は、各利用者の mailForward
属性に格納されているものとします。LDAP サーバから読み込むための設定ファイルを、以下のように用意します。
bind=yes
bind_dn=cn=mailsystem,ou=systems,dc=example,dc=jp
bind_pw=********
server_host=ldap.example.jp
server_port=389
timeout=20
search_base=ou=users,dc=example,dc=jp
scope=sub
query_filter=(uid=%u)
result_attribute=mailForward
正しく設定されていれば、以下のコマンドで利用者の転送設定が取り出せるはずですので、確認しておいて下さい。
$ postmap -q alice@example.jp ldap:/etc/postfix/forward.cf
ここまでの設定で、まず、全ての利用者(現役の利用者、卒業・退職済み利用者、双方ともに)について、LDAP の設定内容にしたがってメールの転送が行われるようになっているはずです。
なお、メールを転送するだけでなく、メールボックスにも配送を希望する利用者には、以下のように自分自身のメールアドレスも mailForward
属性に書いておいてもらう必要があります。
mailForward: alice@outside.example.net
mailForward: alice@example.jp
メールボックスに配送する時点で、卒業・退職済み利用者宛のメールを破棄する
まず、/etc/postfix/main.cf
に以下のように設定します。
local_recipient_maps = $mailbox_transport_maps
mailbox_transport_maps =
ldap:/etc/postfix/active_mailbox.cf
ldap:/etc/postfix/expired_mailbox.cf
現役の利用者宛のメールが LMTP 配送されるように、以下のように設定します。なお、利用者の状態は、各利用者の accountStatus
属性に格納されているものとします。
bind=yes
bind_dn=cn=mailsystem,ou=systems,dc=example,dc=jp
bind_pw=********
server_host=ldap.example.jp
server_port=389
timeout=20
search_base=ou=users,dc=example,dc=jp
scope=sub
query_filter=(&(uid=%u)(accountStatus=active))
result_attribute=uid
result_format=lmtp:imap.example.jp
最後の result_format
パラメータの設定が重要です。ここで、LMTP 配送すること、配送先が imap.example.jp
であること、の2点を指定しています。
卒業・退職済み利用者宛のメールが破棄されるように、以下のように設定します。
bind=yes
bind_dn=cn=mailsystem,ou=systems,dc=example,dc=jp
bind_pw=********
server_host=ldap.example.jp
server_port=389
timeout=20
search_base=ou=users,dc=example,dc=jp
scope=sub
query_filter=(&(uid=%u)(!(accountStatus=active)))
result_attribute=uid
result_format=discard
最後の result_format
パラメータで、配送先を discard
と指定していることがポイントです。discard
は、Postfix の特殊な配送先の一種で、メールを全て破棄する配送先です。
-
例えば、寄付金を募るなど。 ↩