ウェブメール開発環境の構築

本章ではシラサギのウェブメール開発環境の構築方法を解説します。

構築手順

以下のサービスを設定します。

シラサギのユーザーが既定で example.jp ドメインに所属するので、 example.jp ドメインでメールの送受信が可能となるように Postfix と Dovecot を設定します。

さらに、開発サーバーですので外部にメールが誤って送られないように設定します。

最後にシラサギのウェブメールを設定します。

対象 OS は CentOS7 です。他の OS をご利用の方は適時読み替えてください。

Dovecot

インストール

次のコマンドを実行し Dovecot をインストールします。

$ sudo yum install dovecot

設定

Dovecot の次の設定ファイルを編集します。

それぞれのファイルの差分を以下に掲載するので適時修正してください。

/etc/dovecot/conf.d/10-auth.conf

--- 10-auth.conf.orig	2013-04-17 22:59:47.000000000 +0900
+++ 10-auth.conf	2017-10-18 11:31:05.818193658 +0900
@@ -97,7 +97,7 @@
 #   plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp skey
 #   gss-spnego
 # NOTE: See also disable_plaintext_auth setting.
-auth_mechanisms = plain
+auth_mechanisms = cram-md5
 
 ##
 ## Password and user databases
@@ -119,10 +119,10 @@
 #!include auth-deny.conf.ext
 #!include auth-master.conf.ext
 
-!include auth-system.conf.ext
+#!include auth-system.conf.ext
 #!include auth-sql.conf.ext
 #!include auth-ldap.conf.ext
-#!include auth-passwdfile.conf.ext
+!include auth-passwdfile.conf.ext
 #!include auth-checkpassword.conf.ext
 #!include auth-vpopmail.conf.ext
-#!include auth-static.conf.ext
+!include auth-static.conf.ext

次の設定を変更しています。 

/etc/dovecot/conf.d/10-mail.conf

--- 10-mail.conf.orig	2017-08-03 15:50:49.000000000 +0900
+++ 10-mail.conf	2017-10-20 16:37:14.173826076 +0900
@@ -28,6 +28,7 @@
 # <doc/wiki/MailLocation.txt>
 #
 #mail_location = 
+mail_location = maildir:/var/spool/virtual/%d/%n/Maildir
 
 # If you need to set multiple mailbox locations or want to change default
 # namespace settings, you can do it by defining namespace sections.
@@ -206,6 +207,7 @@
 # Space separated list of plugins to load for all services. Plugins specific to
 # IMAP, LDA, etc. are added to this list in their own .conf files.
 #mail_plugins = 
+mail_plugins = quota
 
 ##
 ## Mailbox handling optimizations

次の設定を変更しています。 

なお CentOS6 では、次の設定が追加で必要でした。 もしウェブメールが動作しない場合は次の設定を追加してみてください。

# System user and group used to access mails. If you use multiple, userdb
# can override these by returning uid or gid fields. You can use either numbers
# or names. <doc/wiki/UserIds.txt>
mail_uid = 10000
mail_gid = 10000

/etc/dovecot/conf.d/10-master.conf

--- 10-master.conf.orig	2013-03-14 22:28:31.000000000 +0900
+++ 10-master.conf	2017-10-17 20:50:01.176512404 +0900
@@ -86,16 +86,18 @@
   # To give the caller full permissions to lookup all users, set the mode to
   # something else than 0666 and Dovecot lets the kernel enforce the
   # permissions (e.g. 0777 allows everyone full permissions).
-  unix_listener auth-userdb {
-    #mode = 0666
-    #user = 
-    #group = 
-  }
+  #unix_listener auth-userdb {
+  #  #mode = 0666
+  #  #user = 
+  #  #group = 
+  #}
 
   # Postfix smtp-auth
-  #unix_listener /var/spool/postfix/private/auth {
-  #  mode = 0666
-  #}
+  unix_listener /var/spool/postfix/private/auth {
+    mode = 0666
+    user = postfix
+    group = postfix
+  }
 
   # Auth process is run as this user.
   #user = $default_internal_user

次の設定を変更しています。 

/etc/dovecot/conf.d/10-ssl.conf

--- 10-ssl.conf.orig	2017-08-03 15:51:20.000000000 +0900
+++ 10-ssl.conf	2017-10-20 12:17:06.801631069 +0900
@@ -5,7 +5,8 @@
 # SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
 # disable plain pop3 and imap, allowed are only pop3+TLS, pop3s, imap+TLS and imaps
 # plain imap and pop3 are still allowed for local connections
-ssl = required
+#ssl = required
+ssl = no
 
 # PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
 # dropping root privileges, so keep the key file unreadable by anyone but

次の設定を変更しています。 

/etc/dovecot/conf.d/20-imap.conf

--- 20-imap.conf.orig	2013-05-20 05:18:00.000000000 +0900
+++ 20-imap.conf	2017-10-18 11:59:13.175050143 +0900
@@ -53,7 +53,7 @@
 
 protocol imap {
   # Space separated list of plugins to load (default is global mail_plugins).
-  #mail_plugins = $mail_plugins
+  mail_plugins = $mail_plugins imap_quota
 
   # Maximum number of IMAP connections allowed for a user from each IP address.
   # NOTE: The username is compared case-sensitively.

次の設定を変更しています。 

/etc/dovecot/conf.d/90-quota.conf

--- 90-quota.conf.orig	2013-04-17 22:59:47.000000000 +0900
+++ 90-quota.conf	2017-10-18 12:02:31.762633631 +0900
@@ -15,13 +15,13 @@
 # to give additional 100 MB when saving to Trash:
 
 plugin {
-  #quota_rule = *:storage=1G
-  #quota_rule2 = Trash:storage=+100M
+  quota_rule = *:storage=1G
+  quota_rule2 = Trash:storage=+100M
 
   # LDA/LMTP allows saving the last mail to bring user from under quota to
   # over quota, if the quota doesn't grow too high. Default is to allow as
   # long as quota will stay under 10% above the limit. Also allowed e.g. 10M.
-  #quota_grace = 10%%
+  quota_grace = 10%%
 }
 
 ##
@@ -65,7 +65,7 @@
 
 plugin {
   #quota = dirsize:User quota
-  #quota = maildir:User quota
+  quota = maildir:User quota
   #quota = dict:User quota::proxy::quota
   #quota = fs:User quota
 }

次の設定を変更しています。 

/etc/dovecot/conf.d/auth-static.conf.ext

--- auth-static.conf.ext.orig	2013-05-20 05:18:00.000000000 +0900
+++ auth-static.conf.ext	2017-10-17 20:28:20.423883735 +0900
@@ -22,3 +22,8 @@
 #  driver = static
 #  args = uid=vmail gid=vmail home=/home/%u
 #}
+
+userdb {
+  driver = static
+  args = uid=10000 gid=10000 home=/var/spool/virtual/%d/%n
+}

次の設定を変更しています。 

/etc/dovecot/users

このファイルには IMAP の利用ユーザーとそのパスワードを登録します。 まず doveadm コマンドを実行し、ハッシュ化されたパスワードを生成します。

$ doveadm pw
Enter new password: pass
Retype new password: pass
{CRAM-MD5}ff5d74b19e3cb9b2b9f4fcb548fe023aeb44f67f231a5a89714d08b5fec22b78

上の実行例ではパスワード pass をハッシュ化しています。 次のような内容を持つテキストを /etc/dovecot/users に設定します。

sys@example.jp:{CRAM-MD5}ff5d74b19e3cb9b2b9f4fcb548fe023aeb44f67f231a5a89714d08b5fec22b78
admin@example.jp:{CRAM-MD5}ff5d74b19e3cb9b2b9f4fcb548fe023aeb44f67f231a5a89714d08b5fec22b78
user1@example.jp:{CRAM-MD5}ff5d74b19e3cb9b2b9f4fcb548fe023aeb44f67f231a5a89714d08b5fec22b78
user2@example.jp:{CRAM-MD5}ff5d74b19e3cb9b2b9f4fcb548fe023aeb44f67f231a5a89714d08b5fec22b78
user3@example.jp:{CRAM-MD5}ff5d74b19e3cb9b2b9f4fcb548fe023aeb44f67f231a5a89714d08b5fec22b78

この例では sys@example.jp, admin@example.jp, user1@example.jp, user2@example.jp, user3@example.jp の 5 ユーザーを登録し、全ユーザーのパスワードが pass であることを前提としています。 シラサギに設定しているユーザー / パスワードに応じて適時読み替えてください。

有効化と起動

次のコマンドを実行し dovecot を有効化し起動します。

$ sudo systemctl enable dovecot
$ sudo systemctl start dovecot

Postfix

設定

CentOS7 であれば Postfix は標準でインストールされているのでインストールは不要です。 設定の変更点だけ説明します。 次の Postfix の設定ファイルを編集します。

それぞれのファイルの差分を以下に掲載するので適時修正してください。

/etc/postfix/master.cf

--- master.cf.orig	2014-06-10 10:39:23.000000000 +0900
+++ master.cf	2017-10-17 20:32:20.048020986 +0900
@@ -13,7 +13,7 @@
 #smtpd     pass  -       -       n       -       -       smtpd
 #dnsblog   unix  -       -       n       -       0       dnsblog
 #tlsproxy  unix  -       -       n       -       0       tlsproxy
-#submission inet n       -       n       -       -       smtpd
+submission inet n       -       n       -       -       smtpd
 #  -o syslog_name=postfix/submission
 #  -o smtpd_tls_security_level=encrypt
 #  -o smtpd_sasl_auth_enable=yes

次の設定を変更しています。 

/etc/postfix/main.cf

--- main.cf.orig	2014-06-10 10:39:24.000000000 +0900
+++ main.cf	2017-10-25 11:29:54.711718567 +0900
@@ -74,6 +74,7 @@
 #
 #myhostname = host.domain.tld
 #myhostname = virtual.domain.tld
+myhostname = ss001.example.jp
 
 # The mydomain parameter specifies the local internet domain name.
 # The default is to use $myhostname minus the first component.
@@ -81,6 +82,7 @@
 # parameters.
 #
 #mydomain = domain.tld
+mydomain = example.jp
 
 # SENDING MAIL
 # 
@@ -97,6 +99,7 @@
 #
 #myorigin = $myhostname
 #myorigin = $mydomain
+myorigin = $mydomain
 
 # RECEIVING MAIL
 
@@ -113,7 +116,8 @@
 #inet_interfaces = all
 #inet_interfaces = $myhostname
 #inet_interfaces = $myhostname, localhost
-inet_interfaces = localhost
+#inet_interfaces = localhost
+inet_interfaces = all
 
 # Enable IPv4, and IPv6 if supported
 inet_protocols = all
@@ -249,6 +253,7 @@
 #mynetworks_style = class
 #mynetworks_style = subnet
 #mynetworks_style = host
+mynetworks_style = subnet
 
 # Alternatively, you can specify the mynetworks list by hand, in
 # which case Postfix ignores the mynetworks_style setting.
@@ -417,6 +422,7 @@
 #
 #home_mailbox = Mailbox
 #home_mailbox = Maildir/
+home_mailbox = Maildir/
  
 # The mail_spool_directory parameter specifies the directory where
 # UNIX-style mailboxes are kept. The default setting depends on the
@@ -545,7 +551,7 @@
 #
 # For details, see "man header_checks".
 #
-#header_checks = regexp:/etc/postfix/header_checks
+header_checks = regexp:/etc/postfix/header_checks
 
 # FAST ETRN SERVICE
 #
@@ -677,3 +683,17 @@
 # readme_directory: The location of the Postfix README files.
 #
 readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
+
+#
+virtual_mailbox_domains = example.jp
+virtual_mailbox_base = /var/spool/virtual
+virtual_mailbox_maps = hash:/etc/postfix/vmailbox
+virtual_uid_maps = static:10000
+virtual_gid_maps = static:10000
+
+#
+smtpd_sasl_auth_enable = yes
+smtpd_sasl_type = dovecot
+smtpd_sasl_path = private/auth
+smtpd_client_restrictions = permit_mynetworks, reject_unknown_client, permit
+smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

/etc/postfix/header_checks

次の行をファイルの末尾に追加します。

/^To:.*@example.jp/ OK
/^To:.*/ REDIRECT sys@example.jp

この設定は To に @example.jp ドメインを持つメールアドレスが設定されていれば送信 OK とし、 それ以外のメールアドレスが設定されていれば sys@example.jp へ転送します。

メールディレクトリの作成

ディレクトリを作成する前に、次のユーザーとグループを作成します。

$ sudo groupadd -g 10000 mailuser
$ sudo useradd -u 10000 -g mailuser -s /sbin/nologin mailuser

今回は /var/spool/virtual ディレクトリにメールを保存するように Postfix を設定したので、 次のコマンドを実行しディレクトリを作成します。

$ sudo mkdir /var/spool/virtual
$ sudo chown -R mailuser:mailuser /var/spool/virtual

仮想ユーザーの作成

Postfix でメールを受信可能なユーザーを作成します。

以下のような内容を持つ /etc/postfix/vmailbox を作成します。

sys@example.jp   example.jp/sys/Maildir/
admin@example.jp example.jp/admin/Maildir/
user1@example.jp example.jp/user1/Maildir/
user2@example.jp example.jp/user2/Maildir/
user3@example.jp example.jp/user3/Maildir/

sys@example.jp 宛に届いたメールは /var/spool/virtual/example.jp/sys/Maildir/ 以下に格納するように設定しています。

そして次のコマンドを実行しテキストファイルを DB 化します。

$ sudo postmap /etc/postfix/vmailbox

再起動

次のコマンドを実行し Postfix を再起動します。

$ sudo systemctl restart postfix

テストメールの送信とメールディレクトリの作成

メールが 1 通もない状態だと、シラサギのウェブメールを表示した際に認証エラーとなります。

上記の設定のテストも兼ねてテストメールを送ってみます。

$ echo 'This is test mail.' | sendmail sys@example.jp
$ echo 'This is test mail.' | sendmail admin@example.jp
$ echo 'This is test mail.' | sendmail user1@example.jp
$ echo 'This is test mail.' | sendmail user2@example.jp
$ echo 'This is test mail.' | sendmail user3@example.jp

正常に送信できたかどうかは /var/log/maillog を確認します。

$ sudo cat /var/log/maillog

次のような行が表示されていれば送信が成功しています。

Oct 18 11:46:21 localhost postfix/virtual[15842]: 6BAEA113BE76: to=<user3@example.jp>, relay=virtual, delay=0.01, delays=0/0/0/0, dsn=2.0.0, status=sent (delivered to maildir)

status=sent となっており、送信に成功しています。

それでは、シラサギのウェブメールを設定し、シラサギでテストメールが届いているかどうか確認してみます。

シラサギのウェブメールの設定

シラサギをインストールしたディレクトリに移動し、次のコマンドを実行します。

$ cp -n config/defaults/webmail.yml config/webmail.yml 

config/webmail.yml の差分を以下に掲載しています。適時修正してください。

--- config/defaults/webmail.yml	2017-10-18 11:37:01.760733167 +0900
+++ config/webmail.yml	2017-10-18 11:54:38.852555338 +0900
@@ -9,11 +9,11 @@
   clients:
     default:
       # host
-      host: localhost
+      host: 127.0.0.1
       options:
         port: 143
       # auth_type: LOGIN, PLAIN, CRAM-MD5, DIGEST-MD5
-      auth_type: LOGIN
+      auth_type: CRAM-MD5
       # account: uid, email
       account: email

シラサギを起動している場合は次のコマンドを実行しシラサギを停止します。

$ bundle exec rake unicorn:stop

そして次のコマンドを実行し、シラサギを起動します。

$ bundle exec rake unicorn:start

シラサギの管理画面へアクセスし、ウェブメールが正しく表示されていることを確認してください。

新しいユーザーを追加する場合

新しいユーザーを追加するには次のファイルにユーザーを追加します。

/etc/postfix/vmailbox を編集した後 sudo postmap /etc/postfix/vmailbox コマンドを実行する必要があります。