![[サーバ構築編#10] UbuntuでPostfixとDovecotを利用してメールサーバ構築](/_next/image?url=%2Farticles%2Fserver%2Fpostfix%2Fhero.jpg&w=3840&q=75)
サーバ構築編#10Ubuntuで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サーバの設定・ファイルなどを更新しないユーザを
○Dovecot のフィルタリング機能を活用できる
今回は利用しませんがSieve(メールフィルタリング)のような Dovecot の機能を使って、受信時に自動で振り分けもできます。
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]で
なお、[サーバ構築編#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
上記に
postfix
とdovecot
のリロードを追記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[2025年 3月 22日 土曜日 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を学んで少しずつできることが広がりつつあります。その実践記録をできるだけ共有していければと思っています。
▼ 関連記事
[サーバ構築編#2] さくらクラウドでPostgreSQLのアプライアンスDBを作る
運用が楽々なアプライアンス「データベース」でPostgreSQL環境を作成
2025/6/20公開
![[サーバ構築編#2] さくらクラウドでPostgreSQLのアプライアンスDBを作るのイメージ](/_next/image?url=%2Farticles%2Fserver%2Fsakura-cloud-db%2Fhero-thumbnail.jpg&w=1200&q=75)
[サーバ構築編#3] Ubuntu初期設定-ユーザ作成とSSH接続の強化
SSHでサーバへ接続して、Ubuntu Server 24.04.1LTSの主にユーザ作成とSSH接続の強化
2025/6/20公開
![[サーバ構築編#3] Ubuntu初期設定-ユーザ作成とSSH接続の強化のイメージ](/_next/image?url=%2Farticles%2Fserver%2Fubuntu-user-ssh%2Fhero-thumbnail.jpg&w=1200&q=75)
[サーバ構築編#4] Ubuntu初期設定-日本語化
Ubuntu Server 24.04.1LTSの言語設定の日本語化とシステム時間の日本時間ゾーン設定
2025/6/20公開
![[サーバ構築編#4] Ubuntu初期設定-日本語化のイメージ](/_next/image?url=%2Farticles%2Fserver%2Fubuntu-locale%2Fhero-thumbnail.jpg&w=1200&q=75)
[サーバ構築編#5] Ubuntu初期設定-アプライアンスDB(PostgreSQL 13)との接続設定
Webサーバのイーサネット設定を行いローカルスイッチとアプライアンスDBのPostgreSQL 13へのアクセスを可能に
2025/6/20公開
![[サーバ構築編#5] Ubuntu初期設定-アプライアンスDB(PostgreSQL 13)との接続設定のイメージ](/_next/image?url=%2Farticles%2Fserver%2Fubuntu-ethernets%2Fhero-thumbnail.jpg&w=1200&q=75)
[サーバ構築編#1] さくらクラウドでUbuntuサーバのインスタンスを作る
コントロールパネルからサクッとUbuntuサーバのインスタンスを作成
2025/6/20公開
![[サーバ構築編#1] さくらクラウドでUbuntuサーバのインスタンスを作るのイメージ](/_next/image?url=%2Farticles%2Fserver%2Fsakura-cloud-server%2Fhero-thumbnail.jpg&w=1200&q=75)