DELOGs
[サーバ構築編#10] UbuntuでPostfixとDovecotを利用してメールサーバ構築

サーバ構築編#10
UbuntuでPostfixとDovecotを利用してメールサーバ構築

PostfixとDovecotの組み合わせでメールサーバ構築。DovecotのLMTPを利用してDBでメールユーザ管理を実現

初回公開日

最終更新日

サーバ構築編第10回は、Ubuntu 24.04 LTSでのメールサーバ構築です。 メールサーバ構築において一般的で広く採用されているPostfixとDovecotの組み合わせで行っていきます。 今回は、サーバに登録済みのドメイン間でメール受送信の完了までを実施します。 外部ドメインへの送信についてはSPFやDKIM設定が必要になります。これらは次回に実施します。
作業を始める前に、サーバドメインのDNS設定でMXレコードを設定していない場合は、設定しておいてください(例:MX 10 @とかMX 10 example.com.など)。
Postfixはメールの送信(SMTP)を担当し、Dovecotはメールの受信(IMAP/POP3)を担当する役割分担があります。 またDovecot の LMTP(Local Mail Transfer Protocol)を利用します。
LMTP(Local Mail Transfer Protocol)とは?
LMTP は SMTP に似た軽量なプロトコル で、MTA(Postfix)から MDA(Dovecot)へメールを転送するときに使われます。標準の maildir や mbox 配送と比べて、次のメリットがあります。
○高効率なメール配送
maildir や mbox に直接書き込むより、Dovecot を経由する方がロック処理が不要になり、高速に。
○仮想ユーザー環境に適している
仮想ユーザとはメール専用ユーザのことです。Ubuntuサーバの設定・ファイルなどを更新しないユーザをadd userするのは運用が大変なのと同時にユーザが限定される方がセキュリティも高まります。メール専用ユーザは専用のDB・テーブルへ登録して運用管理します。
○Dovecot のフィルタリング機能を活用できる
今回は利用しませんがSieve(メールフィルタリング)のような Dovecot の機能を使って、受信時に自動で振り分けもできます。
今回はDBを利用します。[サーバ構築編#2][サーバ構築編#5]で説明しておりますが、私の環境では「さくらのクラウド」のアプライアンスデータベース「PostgreSQL 13」を利用しています。
また、SSLは[サーバ構築編#7]の通り、Certbot 4.0.0で「Let's Encrypt」を利用しています。
以上の環境での実装記録になります。

1. 必要なパッケージのインストール

まず、必要なパッケージをインストールします。
bash
1sudo apt update 2sudo apt install -y postfix postfix-pgsql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-pop3d dovecot-pgsql
  • postfix → メール送受信の MTA
  • postfix-pgsql → Postfix で PostgreSQL を利用
  • dovecot-core → Dovecot の基本機能
  • dovecot-imapd → IMAP を有効化
  • dovecot-lmtpd → LMTP でメール配送
  • dovecot-pgsql → Dovecot で PostgreSQL を利用
Postfixインストール中の回答例:
Postfix Configuration=>インターネットサイト (Internet site)、デフォルトのサーバネームを選択

2. PostgreSQL のデータベース作成

メールユーザ管理用DBとテーブルを作成します。 SQLコマンドでの作成例です。テーブルの内容などは用途に合わせて改変してください。
sql
1-- データベースへの接続 2psql -h 192.168.XXX.XXX -p 5432 -U dbuser 3 4-- メールデータベース作成 5CREATE DATABASE maildb 6ENCODING 'UTF8' 7LC_COLLATE 'ja_JP.UTF-8' 8LC_CTYPE 'ja_JP.UTF-8' 9TEMPLATE template0; 10 11-- データベースの変更 12\c maildb 13 14-- maildb用の PostgreSQL ユーザー作成、'securepassword'がパスワード部分 15CREATE USER mailuser WITH PASSWORD 'securepassword'; 16# 上記はPostfixとdovecotが利用するユーザ 17 18-- UUID拡張機能の有効化(まだの場合でUUIDを使う場合) 19CREATE EXTENSION IF NOT EXISTS "pgcrypto"; 20 21-- updated_atの自動更新トリガー関数(各テーブルで`updated_at`カラムを設ける場合) 22CREATE OR REPLACE FUNCTION set_updated_at() 23RETURNS TRIGGER AS $$ 24BEGIN 25NEW.updated_at = CURRENT_TIMESTAMP; 26RETURN NEW; 27END; 28$$ LANGUAGE plpgsql; 29 30## テーブル作成のもろもろ 31 32-- テーブル: virtual_domains 33CREATE TABLE virtual_domains ( 34 id UUID DEFAULT gen_random_uuid() PRIMARY KEY, 35 created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), 36 updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), 37 name VARCHAR(255) NOT NULL UNIQUE, 38 is_active BOOLEAN DEFAULT TRUE NOT NULL, 39 is_local BOOLEAN DEFAULT FALSE NOT NULL 40); 41 42-- インデックス: 43CREATE INDEX idx_virtual_domains_name ON virtual_domains(name); 44 45-- updated_atの自動更新トリガー 46CREATE TRIGGER set_updated_at_virtual_domains 47BEFORE UPDATE ON virtual_domains 48FOR EACH ROW 49EXECUTE FUNCTION set_updated_at(); 50 51-- テーブル: virtual_users 52CREATE TABLE virtual_users ( 53 id UUID DEFAULT gen_random_uuid() PRIMARY KEY, 54 created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), 55 updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), 56 email VARCHAR(255) NOT NULL UNIQUE, 57 password TEXT NOT NULL, 58 domain_id UUID NOT NULL REFERENCES virtual_domains(id) ON DELETE CASCADE, 59 is_active BOOLEAN DEFAULT TRUE NOT NULL, 60 is_local BOOLEAN DEFAULT FALSE NOT NULL, 61 name VARCHAR(255), 62 comment TEXT 63); 64 65-- インデックス: 66CREATE INDEX idx_virtual_users_email ON virtual_users(email); 67 68-- updated_atの自動更新トリガー 69CREATE TRIGGER set_updated_at_virtual_users 70BEFORE UPDATE ON virtual_users 71FOR EACH ROW 72EXECUTE FUNCTION set_updated_at(); 73 74 75-- テーブル: mailing_lists 76CREATE TABLE mailing_lists ( 77 id UUID DEFAULT gen_random_uuid() PRIMARY KEY, 78 created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), 79 updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), 80 list_address VARCHAR(255) NOT NULL UNIQUE, 81 is_active BOOLEAN DEFAULT TRUE NOT NULL, 82 domain_id UUID NOT NULL REFERENCES virtual_domains(id) ON DELETE CASCADE 83); 84 85-- インデックス: 86CREATE INDEX idx_mailing_lists_list_address ON mailing_lists(list_address); 87 88-- updated_atの自動更新トリガー 89CREATE TRIGGER set_updated_at_mailing_lists 90BEFORE UPDATE ON mailing_lists 91FOR EACH ROW 92EXECUTE FUNCTION set_updated_at(); 93 94-- テーブル: mailing_list_members 95CREATE TABLE mailing_list_members ( 96 id UUID DEFAULT gen_random_uuid() PRIMARY KEY, 97 created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), 98 updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), 99 list_id UUID NOT NULL REFERENCES mailing_lists(id) ON DELETE CASCADE, 100 user_id UUID NOT NULL REFERENCES virtual_users(id) ON DELETE CASCADE, 101 is_active BOOLEAN DEFAULT TRUE NOT NULL, 102 CONSTRAINT unique_list_user UNIQUE (list_id, user_id) 103); 104 105-- updated_atの自動更新トリガー 106CREATE TRIGGER set_updated_at_mailing_list_members 107BEFORE UPDATE ON mailing_list_members 108FOR EACH ROW 109EXECUTE FUNCTION set_updated_at(); 110 111## 112 113-- mailuserに接続と読み取り権限を付与 114GRANT CONNECT ON DATABASE maildb TO mailuser; 115GRANT USAGE ON SCHEMA public TO mailuser; 116GRANT SELECT ON ALL TABLES IN SCHEMA public TO mailuser; 117ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO mailuser;
一応、後からメールユーザ管理システムを作成する想定で、各テーブルを作成してみました。 これで、ドメイン管理、メールユーザ管理、メーリングリスト管理が可能になる想定です。 メールユーザ管理システムは別途「Next.js関連」カテゴリで紹介します。
メールユーザのパスワードは「argon2」で暗号化する想定です(後述)。
以下はこれを踏まえたPostfixとDovecotの設定になります。

3. Postfix の設定(仮想メールユーザー & メーリングリスト対応)

Postfix に 仮想メールボックスとメーリングリストを PostgreSQL から取得できるようにします。
なお、[サーバ構築編#5]で/etc/hostsにDBアプライアンスの名称を設定していますので、DBについてはIPアドレスではなく、この名称db-read.localを利用して設定します。これは後々、運用時にIPアドレスが変更になっても/etc/hostsだけを変更すればいいようにしたいためです。IPアドレスを直に設定したいという方はdb-read.localをIPに置き換えて参照してください。

PostgreSQL との連携設定ファイルを作成

Postfix はデフォルトでファイルベースの virtual_alias_maps や virtual_mailbox_maps を使うが、今回は PostgreSQL からデータを取得するように設定する。
仮想メールドメインの設定
bash
1sudo vi /etc/postfix/pgsql-virtual-mailbox-domains.cf
bash : pgsql-virtual-mailbox-domains.cf
1user = mailuser 2password = securepassword 3dbname = maildb 4hosts = db-read.local 5query = SELECT name FROM virtual_domains WHERE name='%s' AND is_active=true
  • virtual_domains から 有効 (is_active=true) なドメインのみ取得
  • Postfix はこのクエリを使って「このドメインは存在するか?」をチェックする
仮想メールユーザーの設定
bash
1sudo vi /etc/postfix/pgsql-virtual-mailbox-maps.cf
bash : pgsql-virtual-mailbox-maps.cf
1user = mailuser 2password = securepassword 3dbname = maildb 4hosts = db-read.local 5query = SELECT email FROM virtual_users WHERE email='%s' AND is_active=true
  • virtual_users から 有効なユーザーのみ取得
  • Postfix はこのクエリを使って「このメールアドレスは受信可能か?」を判断する
メーリングリストの設定
bash
1sudo vi /etc/postfix/pgsql-virtual-mailing-list.cf
bash : pgsql-virtual-mailing-list.cf
1user = mailuser 2password = securepassword 3dbname = maildb 4hosts = db-read.local 5query = SELECT virtual_users.email FROM mailing_list_members JOIN virtual_users ON mailing_list_members.user_id = virtual_users.id JOIN mailing_lists ON mailing_list_members.list_id = mailing_lists.id WHERE mailing_lists.list_address='%s' AND mailing_lists.is_active=true AND mailing_list_members.is_active=true AND virtual_users.is_active=true
  • mailing_lists に登録されているメーリングリストの 宛先 (list_address) を Postfix が受け取ったら
  • mailing_list_members に登録されているメンバー全員へ転送する

main.cf の設定

Postfix に 上記の PostgreSQL 設定を反映していきます。 main.cfは結構変更するので、デフォルトをバックアップしておいた方がいいと思います。
bash
1sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.bk 2sudo vi /etc/postfix/main.cf
example.comがメインドメインとしての設定:
bash : main.cf
1# サーバのホスト名 2myhostname = example.com 3mydomain = example.com 4myorigin = $mydomain 5 6# 送信メールの発信元IP固定 7smtp_bind_address = xxx.xxx.xxx.xxx 8 9# 基本設定 10smtpd_banner = $myhostname ESMTP 11biff = no 12append_dot_mydomain = no 13readme_directory = no 14compatibility_level = 3.6 15 16# TLS(SSL)設定(Let's Encrypt 使用) 17smtpd_tls_cert_file=/etc/letsencrypt/live/example.com/fullchain.pem 18smtpd_tls_key_file=/etc/letsencrypt/live/example.com/privkey.pem 19smtpd_use_tls=yes 20smtpd_tls_security_level=may 21smtp_tls_security_level=may 22smtp_tls_CApath=/etc/ssl/certs 23smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache 24 25# Submission ポート用の設定 26smtpd_tls_auth_only = yes 27smtpd_sasl_auth_enable = yes 28smtpd_sasl_type = dovecot 29smtpd_sasl_path = private/auth 30smtpd_sasl_local_domain = $mydomain 31smtpd_recipient_restrictions = 32 permit_sasl_authenticated, 33 permit_mynetworks, 34 reject_unauth_destination 35 36# LMTP経由ではSMTPUTF8を使わないようにする 37smtputf8_enable = no 38 39# メールのリレー制限(認証ユーザーとローカルネットワークのみ許可) 40smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination 41 42# 受信する仮想メールドメイン(PostgreSQL から取得) 43virtual_mailbox_domains = pgsql:/etc/postfix/pgsql-virtual-mailbox-domains.cf 44virtual_mailbox_maps = pgsql:/etc/postfix/pgsql-virtual-mailbox-maps.cf 45 46# メーリングリスト設定(PostgreSQL から取得) 47virtual_alias_maps = pgsql:/etc/postfix/pgsql-virtual-mailing-list.cf 48 49# メールの配送先(Dovecot の LMTP を使用) 50virtual_transport = lmtp:unix:private/dovecot-lmtp 51 52# 送信元ドメインの制限 53mydestination = localhost 54 55# 送信リレー(必要なら設定、通常は空) 56relayhost = 57 58# 許可するネットワーク(ローカルのみ) 59mynetworks = 127.0.0.0/8 [::1]/128 60 61# メールボックスサイズ制限(0 = 無制限) 62mailbox_size_limit = 0 63 64# アドレスの区切り記号 65recipient_delimiter = + 66 67# ネットワークインターフェース設定 68inet_interfaces = all 69inet_protocols = ipv4
  • myhostnameはサーバの逆引き設定をしたドメインを設定します。
  • mydomainは運用するメインのドメインを設定します。
  • smtp_bind_addressはサーバのグローバルIPを設定します。
  • TLS(SSL)設定はメインドメインの認証ファイルがある場所を指定します。
  • SMTPのサブミッションポート用の設定も実施します。
  • recipient_delimiterは利用しないかもしれませんが、サブアドレス用に指定します。user+test@example.comへ送られたメールがuser@example.comへ届きます。ユーザが自分のアドレスへバリエーションをつけることができます。

Postfix が Submission ポート (587) をリスンする設定

bash
1sudo vi /etc/postfix/master.cf
ここはsubmissionの記述がデフォルトではコメントアウトされているので、コメントアウトを外して下記のようにします。
bash : master.cf
1submission inet n - y - - smtpd 2 -o syslog_name=postfix/submission 3 -o smtpd_tls_security_level=encrypt 4 -o smtpd_sasl_auth_enable=yes 5 -o smtpd_tls_auth_only=yes 6 -o smtpd_client_restrictions=permit_sasl_authenticated,reject 7 -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject 8 -o smtpd_relay_restrictions=permit_sasl_authenticated,reject 9 -o milter_macro_daemon_name=ORIGINATING

Postfix の再起動

これまでの設定を反映
bash
1sudo postfix check 2sudo systemctl restart postfix
この時/etc/hosts関連でpostfix/postfix-script: warning: /var/spool/postfix/etc/hosts and /etc/hosts differのような警告が出る場合は下記のようにコピーコマンド実行してください。
bash
1sudo cp /etc/hosts /var/spool/postfix/etc/hosts
/etc/hostsを編集した場合は、毎回/var/spool/postfix/etc/hostsへコピーする必要があります。postfixは専用のhostsを参照する仕様になっているためです。忘れそうなので、私は/etc/hostsにコメントで注意書きをするようにしています。

4.Dovecot の設定

DovecotについてもPostgreSQL からユーザー認証できるように設定していきます。 Dovecotの設定ファイルはコメントアウトされている内容が非常に多くなっているので、バックアップをとってから、必要な内容だけ記述すると後で見やすくなります。
なお、Dovecotの設定でもPostfixの設定と同様に、DBについてはIPアドレスではなく、/etc/hostsで設定した名称db-read.localを利用して設定します。IPアドレスを直に設定したいという方はdb-read.localをIPに置き換えて参照してください。

dovecot-sql.conf.ext の作成

bash
1sudo cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.bk 2sudo vi /etc/dovecot/dovecot-sql.conf.ext
bash : dovecot-sql.conf.ext
1driver = pgsql 2connect = host=db-read.local dbname=maildb user=mailuser password=securepassword 3default_pass_scheme = ARGON2ID 4password_query = SELECT email as user, password FROM virtual_users WHERE email='%u' AND is_active=true
  • default_pass_scheme = ARGON2ID → パスワードは Argon2id 方式で保存する
  • is_active=true のユーザーのみ認証を許可する

Dovecot の認証設定

bash
1sudo cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.bk 2sudo vi /etc/dovecot/conf.d/10-auth.conf
bash : 10-auth.conf
1disable_plaintext_auth = no 2 3auth_mechanisms = plain login 4passdb { 5 driver = sql 6 args = /etc/dovecot/dovecot-sql.conf.ext 7} 8userdb { 9 driver = static 10 args = uid=5000 gid=5000 home=/var/mail/vmail/%d/%n 11}
  • disable_plaintext_auth = noはメールクライアントのSMTPでサブミッションポートを利用する際の対応(「ポート587 + STARTTLS」)
  • uid=5000 gid=5000 → 仮想メールユーザー専用の vmail ユーザーを使う
  • メールボックスの場所は /var/mail/vmail/example.com/user/Maildir/ になる

LMTP の設定

bash
1sudo cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.bk 2sudo vi /etc/dovecot/conf.d/10-master.conf
SSLでの接続のみ許可していきます。
bash : 10-master.conf
1service imap-login { 2 inet_listener imaps { 3 port = 993 4 ssl = yes 5 } 6} 7 8service pop3-login { 9 inet_listener pop3s { 10 port = 995 11 ssl = yes 12 } 13} 14 15service submission-login { 16 inet_listener submission { 17 port = 587 18 } 19} 20 21service lmtp { 22 unix_listener /var/spool/postfix/private/dovecot-lmtp { 23 mode = 0600 24 user = postfix 25 group = postfix 26 } 27} 28 29service auth { 30 unix_listener /var/spool/postfix/private/auth { 31 mode = 0660 32 user = postfix 33 group = postfix 34 } 35}
  • この設定で Postfix から Dovecot にメールを LMTP で渡せるようになる
  • service authはPostfix が Dovecot の認証ソケット /var/spool/postfix/private/auth にアクセスできるようにします。これでSMTP認証ができます。

/etc/dovecot/conf.d/10-ssl.conf の設定

bash
1sudo cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.bk 2sudo vi /etc/dovecot/conf.d/10-ssl.conf
bash : 10-ssl.conf
1ssl = required 2ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem 3ssl_key = </etc/letsencrypt/live/example.com/privkey.pem 4ssl_dh = </etc/dovecot/dh.pem 5ssl_cipher_list = HIGH:!aNULL:!MD5 6ssl_prefer_server_ciphers = yes
下記でDiffie-Hellman (DH) パラメータを作成:
bash
1sudo openssl dhparam -out /etc/dovecot/dh.pem 4096 2sudo chmod 600 /etc/dovecot/dh.pem
  • DH パラメータは基本は一度作成すればOK
  • 作成に少し時間がかかるので、作成コマンドを実行したら焦らず待ちます。

vmail ユーザーの作成

Dovecot では 仮想メールユーザー を管理するために vmail という専用の システムユーザー を作るのが一般的です。このvmailというユーザーはメールの保存専用のユーザになります(vmailでログインなどはできないようにします)。
bash
1# vmail グループの作成(GID: 5000) 2sudo groupadd -g 5000 vmail 3 4# vmail ユーザーの作成(UID: 5000, ログイン不可, メール保存用) 5sudo useradd -m -d /var/mail/vmail -u 5000 -g 5000 -s /bin/false vmail 6 7# 仮想メールディレクトリの作成 8sudo mkdir -p /var/mail/vmail 9 10# vmail ユーザーに所有権を設定 11sudo chown -R vmail:vmail /var/mail/vmail 12sudo chmod -R 770 /var/mail/vmail

Dovecot の再起動

bash
1sudo systemctl restart dovecot

5. ポートの解放

ufwでポートを解放します。
bash
1sudo ufw allow 25/tcp. #外部からのメールを受信するため 2sudo ufw allow 993/tcp # IMAPS 3sudo ufw allow 995/tcp # POP3S 4sudo ufw allow 587/tcp # Submission (SMTP) 5sudo ufw reload
念のため、dovecotとpostfixを再起動
bash
1sudo systemctl restart dovecot 2sudo systemctl restart postfix

6. 動作確認

テストデータ作成

データベースへメールユーザを登録していきます。 今回はUUIDを利用しているので、リレーションのところを手動で登録するのは少し面倒ですが、管理システムを作れば運用は楽になります。
bash
1# メールアドレス登録時の暗号化パスワードを生成(後でコピペします) 2# 今回は`argon2`を暗号化ツールとしてDovecotの設定しましたので、これを使います。 3sudo doveadm pw -s ARGON2ID 4 5#上記を実行するとパスワードの入力を2回求められます。 6Enter new password: 7Retype new password: 8 9#すると、下記のようにハッシュ化されたテキストが表示されますので、これを後程使用しますので、メモ帳などに控えておきます。 10{ARGON2ID}$argon2id$v=19$m=65536,t=3,p=1・・・省略
sql
1-- データベースへの接続 2psql -h 192.168.XXX.XXX -p 5432 -U dbuser 3 4-- データベースの変更 5\c maildb 6 7-- ドメインデータの登録 8INSERT INTO virtual_domains (name) VALUES ('example.com'); 9 10-- メールアドレスの登録(ここで`argon2`のハッシュ化されたテキストを使います) 11INSERT INTO virtual_users (email, password, domain_id) VALUES ('user1@example.com','{ARGON2ID}$argon2id$v=19$m=65536,t=3,p=1・・・',(SELECT id FROM virtual_domains WHERE name = 'example.com')); 12 13-- メーリングリストの登録 14INSERT INTO mailing_lists (list_address, domain_id) VALUES ('ml@example.com', (SELECT id FROM virtual_domains WHERE name = 'example.com')); 15 16-- メーリングリストのメンバー登録 17INSERT INTO mailing_list_members (list_id, user_id) 18VALUES ((SELECT id FROM mailing_lists WHERE list_address = 'ml@example.com'), (SELECT id FROM virtual_users WHERE email = 'user1@example.com');
argon2のところですが、{ARGON2ID}はつけておいた方がいいようです。私の環境だと$argon2idから始めて問題なく認証できたのですが、一応Dovecotは{ARGON2ID}を目印にしてargon2で解釈するようです。
これで、ようやく準備が完了しました。

クライアントツールでの検証

すでにあるメールアドレスからuser1@example.comや'ml@example.com'へメール送信して、受信できるか検証してください。 送信については、自分宛(user1@example.comや'ml@example.com')にメールを送って検証してください。まだこの段階では、外部のドメイン(gmailなど)には送信できません。
クライアントツールの設定は下記のようになります。
受信(POP3/IMAP)設定
項目設定内容
ユーザー名メールアドレス(例: user1@example.com
認証方式通常のパスワード認証(PLAIN)
サーバ例:example.com(myhostnameで設定したもの)
接続の保護SSL/TLS
ポート(POP3)995
ポート(IMAP)993
送信(SMTP)設定
項目設定内容
ユーザー名メールアドレス(例: user1@example.com
認証方式通常のパスワード認証(PLAIN)
サーバ例:example.com(myhostnameで設定したもの)
接続の保護STARTTLS
ポート(SMTP)587
以上で、サーバに登録済みのドメイン間でメール受送信はできるようになりました。

7.Let’s Encrypt(Certbot)更新時にPostfixとDovecotをリロードさせる

忘れがちなのがこれです。PostfixとDovecotについてもSSLはLet’s Encrypt(Certbot)を利用していますので、SSL証明書が更新された時にPostfixとDovecotも更新しないとメール使えないという現象に発展してしまいます。
certbot renew の後に Postfix / Dovecot を再起動するように更新後フックを使って設定します。 [サーバ構築編#7] でもやった/etc/letsencrypt/renewal-hooks/post/を利用します。

再起動スクリプトへの追記

bash
1sudo vi /etc/letsencrypt/renewal-hooks/post/reload-services.sh
上記にpostfixdovecotのリロードを追記
bash : reload-mail-services.sh
1#!/bin/bash 2{ 3 echo "[`date`] Reloading Postfix, Dovecot, and Nginx..." 4 5 echo "Reloading nginx..." 6 systemctl reload nginx && echo "✓ nginx reload OK" || echo "✗ nginx reload FAILED" 7 8 echo "Reloading postfix..." 9 systemctl reload postfix && echo "✓ postfix reload OK" || echo "✗ postfix reload FAILED" 10 11 echo "Reloading dovecot..." 12 systemctl reload dovecot && echo "✓ dovecot reload OK" || echo "✗ dovecot reload FAILED" 13 14 echo "" 15} >> /var/log/letsencrypt/reload-services.log 2>&1
もし、初めてこのファイルを作成した場合は、パーミッションに実行権限を追加してください。
bash
1sudo chmod +x /etc/letsencrypt/renewal-hooks/post/reload-services.sh

テスト実行(フックが呼ばれるか確認)

bash
1sudo certbot renew --dry-run
bash
1sudo cat /var/log/letsencrypt/reload-services.log 2[2025322日 土曜日 18:16:38 JST] Reloading Postfix, Dovecot, and Nginx... 3Reloading nginx... 4✓ nginx reload OK 5Reloading postfix... 6✓ postfix reload OK 7Reloading dovecot... 8✓ dovecot reload OK
とリロードログが残ります。
これで、本当に完了です。
次回は、SPFやDKIM設定を行って、外部ドメインへの送信について可能にしていきます。
続きはこちら...
前回の確認はこちら...
この記事の執筆・編集担当
DE

松本 孝太郎

DELOGs編集部/中年新米プログラマー

ここ数年はReact&MUIのフロントエンドエンジニアって感じでしたが、Next.jsを学んで少しずつできることが広がりつつあります。その実践記録をできるだけ共有していければと思っています。