Ubuntu 20.04でPostfix + Dovecot + MariaDBを利用したメールサーバの構築方法について記載していきます。

タイムゾーンを日本に設定

1
sudo timedatectl set-timezone Asia/Tokyo

各種パッケージをインストール

  • Dovecot
  • Postfix
  • MariaDB

をインストールします。

1
2
3
4
5
sudo apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \
  -o Dpkg::Options::="--force-confdef" \
  -o Dpkg::Options::="--force-confold" \
  dovecot-pop3d dovecot-imapd dovecot-mysql mariadb-server postfix-mysql

Postfixのメール受信用設定

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

バーチャルメールボックスを利用してメールを送受信するので、メール保存先のディレクトリを作成します。

1
2
sudo sudo mkdir -pv /var/vmail
sudo chown 5000:5000 /var/vmail

認証用のデータベースの作成、設定

ユーザー認証等をMariaDBに保存したデータで行うため、データベースを作成し、認証用データを保存していきます。

MariaDBにrootユーザーで接続し、

  • 各種テーブルを保存するための「mail」データベース
  • データベースに接続するための「mail」ユーザー

を作成します。
設定するパスワードは適宜変更してください。

1
2
3
4
5
sudo mysql -vv -e "
CREATE DATABASE mail;
CREATE USER mail;
GRANT ALL ON mail.* TO mail IDENTIFIED BY 'password';
"

次に、メールアドレスと保存先を定義するテーブルを作成します。
接続パスワードは適宜変更してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
mysql -vv -u mail -ppassword mail -e "
CREATE TABLE mailbox_maps (
  id int NOT NULL AUTO_INCREMENT,
  address VARCHAR(255) NOT NULL,
  destination VARCHAR(255) NOT NULL,
  is_regexp TINYINT(1) DEFAULT 0 NOT NULL,
  is_active TINYINT(1) DEFAULT 1 NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY (address)
);
"

メールボックス用のコンフィグ設定

virtual_mailbox_domainsは適宜変更してください。

1
2
3
4
5
6
7
8
9
# メールボックスの所有ユーザーとグループを5000で固定する
sudo postconf virtual_uid_maps=static:5000
sudo postconf virtual_gid_maps=static:5000
# メール保存先のベースディレクトリ
sudo postconf virtual_mailbox_base=/var/vmail
# メールを受信するドメイン
sudo postconf virtual_mailbox_domains="example.com, example.net"
# メール保存先の定義
sudo postconf virtual_mailbox_maps=mysql:/etc/postfix/virtual_mailbox_maps.cf

メール保存先を取得するSQLの定義

UbuntuのPostfixはデフォルトでchrootで動作するので、hostsはlocalhostではなく、127.0.0.1で記述する必要があります。localhostだとソケットが読めず、認証に失敗します。
passwordは適宜変更してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cat << EOT | sudo tee /etc/postfix/virtual_mailbox_maps.cf > /dev/null
user = mail
password = password
hosts = 127.0.0.1
dbname = mail
query = SELECT destination FROM mailbox_maps
  WHERE
    (address = '%s' AND is_regexp = 0 AND is_active = 1)
    OR ('%s' REGEXP address AND is_regexp = 1 AND is_active = 1)
EOT

メール保存先マッピングデータの作成

address にメールアドレス、 destination に保存ディレクトリを記述します。
接続パスワードや内容は適宜変更してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mysql -vv -u mail -ppassword mail -e "
INSERT INTO mailbox_maps (address, destination, is_regexp)
VALUES
  # example@example.comの定義
  ('example@example.com', 'example.com/example/', 0),
  # admin@example.com, info@example.comはexample@example.comのボックスに保存(正規表現を利用)
  ('^(admin|info)@example\.com$', 'example.com/example/', 1),
  # ***@example.netはexample@example.netユーザーのディレクトリに保存する
  ('@example.net', 'example.net/example/', 0);
"

サービスリロード

設定を反映させるためにPostfixをリロードします。

1
sudo systemctl reload postfix

動作確認

ここまでの設定で、メールを受信してPostifxのメールボックスに保存することが可能になります。

sendmailコマンドで配送テスト実行します。

1
2
3
4
5
6
7
cat << EOT | sendmail -t
From: from@example.com
To: example@example.com
Subject: hello

this is test mail
EOT

配送されたメールはnewディレクトリに保存されるので、確認します。

1
2
3
4
5
6
sudo find /var/vmail -path '*/new/*' -type f | \
while read line
do
  echo -e "\n\n[file: $line]"
  sudo cat $line
done

メールが届いてない、エラーが発生した場合は/var/log/mail.logを確認して対応します。

Dovecotの設定

認証用ユーザーテーブルの作成

POP3/IMAP/SMTP Authの認証に使用するテーブルを作成します。
接続パスワードや内容は適宜変更してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
mysql -vv -u mail -ppassword mail -e "
CREATE TABLE users (
  id int NOT NULL AUTO_INCREMENT,
  username VARCHAR(128) NOT NULL,
  domain VARCHAR(128) NOT NULL,
  password VARCHAR(64) NOT NULL,
  is_active TINYINT(1) DEFAULT 1 NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY username_domain (username, domain)
);
"

ユーザーの追加

認証ユーザーを追加します。
接続パスワードや内容は適宜変更してください。

1
2
3
4
5
6
mysql -vv -u mail -ppassword mail -e "
INSERT INTO users (username, domain, password)
VALUES
  ('example', 'example.com', 'hogehoge'),
  ('example', 'example.net', 'fugafuga');
"

メール保存先の設定

Postfixと同じディレクトリのメールを参照するため、コンフィグを設定します。

1
sudo sed -Ei 's#^(mail_location).+#\1 = maildir:/var/vmail/%d/%n#' /etc/dovecot/conf.d/10-mail.conf

メールボックス設定

IMAP接続時に自動でディレクトリを作成する設定を行います。
参考: https://wiki.dovecot.org/MailboxSettings

1
2
sudo sed -zEi 's#(mailbox Sent \{\s+)special_use#\1auto = subscribe\n    special_use#m' /etc/dovecot/conf.d/15-mailboxes.conf
sudo sed -zEi 's#(mailbox Junk \{\s+)special_use#\1auto = create\n    special_use#m' /etc/dovecot/conf.d/15-mailboxes.conf

認証のコンフィグ設定

/etc/dovecot/conf.d/10-auth.confを変更して、sql認証を有効にします。

1
sudo sed -Ei 's/#(!include auth-sql\.conf\.ext)/\1/' /etc/dovecot/conf.d/10-auth.conf

dovecotのsql認証内容を設定

/etc/dovecot/dovecot-sql.conf.extにコンフィグを記述します。
接続パスワードは適宜変更してください。

1
2
3
4
5
6
7
8
cat << EOT | sudo tee -a /etc/dovecot/dovecot-sql.conf.ext > /dev/null

driver = mysql
connect = host=localhost dbname=mail user=mail password=password
default_pass_scheme = PLAIN
password_query = SELECT username AS user, domain, password FROM users WHERE username = '%n' AND domain = '%d' AND is_active = 1
user_query = SELECT CONCAT('/var/vmail/', domain, '/', username, '/') as home, 5000 as uid, 5000 as gid FROM users WHERE username = '%n' AND domain = '%d' AND is_active = 1
EOT

SSL証明書の設定

ドメインごとに別々の証明書を利用するので、/etc/dovecot/conf.d/10-ssl.confにドメインごとの証明書パスを設定します。
内容は適宜変更してください。

ワイルドカード証明書の取得については こちら

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
cat << EOT | sudo tee -a /etc/dovecot/conf.d/10-ssl.conf > /dev/null

local_name *.example.com {
  ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
  ssl_key = </etc/letsencrypt/live/example.com/privkey.pem
}
local_name *.example.net {
  ssl_cert = </etc/letsencrypt/live/example.net/fullchain.pem
  ssl_key = </etc/letsencrypt/live/example.net/privkey.pem
}
EOT

サービスリロード

設定を反映させるためにDovecotをリロードします。

1
sudo systemctl reload dovecot

動作確認

メーラーなどにコンフィグを設定し、メール受信が可能なことを確認します。

メールが受信できない、エラーが発生した場合は/var/log/mail.logを確認して対応します。

SMTP認証用の設定

メーラーからメール送信出来るように、SMTP認証の設定を行います。

Postfixに設定を追加

relayhostは利用可能なサーバを設定してください。
例では SendGrid の設定になります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Dovecot連携設定
sudo postconf smtpd_sasl_path=private/auth
sudo postconf smtpd_sasl_type=dovecot

# リレー設定
sudo postconf relayhost=[smtp.sendgrid.net]:587
sudo postconf smtp_sasl_auth_enable=yes
sudo postconf smtp_sasl_password_maps=hash:/etc/postfix/smtp_sasl_password_maps
sudo postconf smtp_sasl_security_options=noanonymous
sudo postconf smtp_tls_security_level=may
sudo postconf tls_server_sni_maps=hash:/etc/postfix/tls_server_sni_maps

リレー時の認証設定

relayhostに接続する際のSMTP認証情報を設定します。
内容は適宜変更してください。

1
2
3
4
cat <<EOT | sudo tee /etc/postfix/smtp_sasl_password_maps > /dev/null
[smtp.sendgrid.net]:587 apikey:SG.xxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
EOT
sudo postmap /etc/postfix/smtp_sasl_password_maps

SSL証明書の設定

ドメインごとに別々の証明書を利用するので、tls_server_sni_mapsに設定したファイルにドメインごとの証明書パスを設定します。
内容は適宜変更してください。

ワイルドカード証明書の取得については こちら

1
2
3
4
5
cat <<EOT | sudo tee /etc/postfix/tls_server_sni_maps > /dev/null
.example.com /etc/letsencrypt/live/example.com/privkey.pem /etc/letsencrypt/live/example.com/fullchain.pem
.example.net /etc/letsencrypt/live/example.net/privkey.pem /etc/letsencrypt/live/example.net/fullchain.pem
EOT
sudo postmap -F /etc/postfix/tls_server_sni_maps

DovecotにPostfixとの連携設定を追加

smtpd_sasl_type=dovecotを設定しているため、Dovecot側にPostfixと連携する設定を追加します。

1
2
3
4
5
6
7
8
9
cat <<EOT | sudo tee /etc/dovecot/conf.d/10-postfix-auth.conf > /dev/null
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}
EOT

Postfixのメール送信用設定

Submissionポート(587)の設定を/etc/postfix/master.cfに追記します。

1
2
3
4
5
6
7
8
sudo postconf -M submission/inet="submission inet n - n - - smtpd"
sudo postconf -P "submission/inet/syslog_name=postfix/submission"
sudo postconf -P "submission/inet/smtpd_tls_security_level=encrypt"
sudo postconf -P "submission/inet/smtpd_sasl_auth_enable=yes"
sudo postconf -P "submission/inet/smtpd_tls_auth_only=yes"
sudo postconf -P "submission/inet/smtpd_client_restrictions=permit_sasl_authenticated,reject"
sudo postconf -P "submission/inet/smtpd_relay_restrictions=permit_sasl_authenticated,reject"
sudo postconf -P "submission/inet/milter_macro_daemon_name=ORIGINATING"

サービスリロード

設定を反映させるためにDovecotをリロードします。

1
sudo systemctl reload dovecot postfix

動作確認

メーラーなどにコンフィグを設定し、メール送信が可能なことを確認します。

メールが送信できない、エラーが発生した場合は/var/log/mail.logを確認して対応します。

参考サイト

http://www.postfix.org/documentation.html
https://doc.dovecot.org/configuration_manual/