2026年8月31日
2026年8月31日
VPSでメールサーバーを構築する方法(Postfix+Dovecot、送達率の対策まで)
VPSでメールサーバーを動かすには、送受信を担う Postfix、メールボックスを読む Dovecot、TLS 証明書、そして DNS(MX・SPF・DKIM・DMARC・逆引き)の5点をそろえる必要があります。この記事では Ubuntu の VPS を例に、独自ドメインで送受信できる最小構成を組み、相手先に迷惑メール扱いされにくくするところまでを順に説明します。
ただし先に結論を書くと、WordPress のお問い合わせ通知やパスワード再設定メールを届けたいだけなら、自前のメールサーバーより外部の送信サービス(Amazon SES、Mailgun など)を SMTP で使うほうが手間もリスクも小さく済みます。自前運用は「受信箱も含めて自分で管理したい」「仕組みを理解したい」場合に向いています。
構築前に確認すること
VPS事業者が25番ポートを開けているか
多くのクラウドや VPS では、迷惑メール対策として外向きの25番ポート(サーバー間のメール転送に使う)が初期状態で塞がれています。申請すれば解除できる事業者、解除できない事業者があり、条件も変わるため、契約中の事業者のヘルプで確認してください。25番が外に出られないと、他社のメールサーバーへ直接配送できません。
逆引き(PTR)を設定できるか
送信元 IP アドレスの逆引きが mail.example.com のようなホスト名を返し、そのホスト名の正引き(A レコード)が同じ IP を返す状態が求められます。逆引きは DNS サービスではなく VPS 事業者の管理画面で設定することが多い項目です。設定できない場合、主要なメール事業者に受け取ってもらえない可能性が高くなります。
大手メール事業者の送信者ガイドライン
Gmail と Yahoo は 2024 年から送信者向けの要件を強化しており、少量の送信でも SPF または DKIM、正しい正引き・逆引き、TLS 接続が求められ、大量送信者には SPF・DKIM・DMARC のすべてと簡単な配信停止手段が求められています(2026年10月現在)。要件は改定されるため、Google の「メール送信者のガイドライン」など各社の一次情報を確認してください。
DNSレコードを用意する
例として、ドメインを example.com、メールサーバーのホスト名を mail.example.com、IP を 203.0.113.10 とします。最初に用意するのは次のレコードです。
mail.example.com. A 203.0.113.10
example.com. MX 10 mail.example.com.
example.com. TXT "v=spf1 mx -all"
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc-report@example.com"
SPF の mx は「MX に書かれたサーバーから送るメールは正当」という意味です。WordPress 本体を別サーバーで動かしていて、そこから直接送る場合はその IP も ip4: で加える必要があります。DMARC は最初 p=none で集計レポートだけ受け取り、正当なメールがすべて SPF か DKIM に合格しているのを確かめてから quarantine、reject と段階的に強めるのが安全です。DKIM のレコードは後述の鍵を作ってから追加します。
Postfixをインストールして送受信の土台を作る
以下は Ubuntu 24.04 LTS を想定したコマンド例です。作業前に VPS のスナップショットを取っておくと、設定を壊しても戻せます。
sudo hostnamectl set-hostname mail.example.com
sudo apt update
sudo apt install postfix
インストール中の設定画面では「Internet Site」を選び、メール名に example.com を入れます。続いて主な設定を postconf -e で書き込みます。main.cf を直接編集してもかまいませんが、このコマンドなら書式の誤りを起こしにくくなります。
sudo postconf -e 'myhostname = mail.example.com'
sudo postconf -e 'mydomain = example.com'
sudo postconf -e 'myorigin = $mydomain'
sudo postconf -e 'mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain'
sudo postconf -e 'inet_interfaces = all'
sudo postconf -e 'home_mailbox = Maildir/'
sudo postconf -e 'smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination'
最後の smtpd_relay_restrictions が重要です。認証していない第三者が自分のサーバーを踏み台にして他人宛てに送れる状態(オープンリレー)になると、短時間でブラックリストに載ります。permit_mynetworks の対象(mynetworks)がローカルだけになっているかも postconf mynetworks で確認してください。
TLS証明書と送信用ポート587
メールソフトからの送信には、認証付きの587番ポート(submission)を使います。まず Let's Encrypt で証明書を取得します。standalone モードは80番ポートで一時的に応答するため、ファイアウォールで80番を開けておきます。
sudo apt install certbot
sudo certbot certonly --standalone -d mail.example.com
sudo postconf -e 'smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem'
sudo postconf -e 'smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem'
sudo postconf -e 'smtpd_tls_security_level = may'
sudo postconf -e 'smtp_tls_security_level = may'
sudo postconf -e 'smtpd_sasl_type = dovecot'
sudo postconf -e 'smtpd_sasl_path = private/auth'
sudo postconf -e 'smtpd_tls_auth_only = yes'
次に /etc/postfix/master.cf の submission の行のコメントを外し、次のように設定します。2行目以降の先頭は空白で始める必要があります。
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
smtpd_tls_auth_only = yes によって、暗号化されていない接続ではパスワード認証を受け付けなくなります。証明書は約90日で更新されるので、更新後に Postfix と Dovecot を再読み込みするよう certbot の deploy フックを設定しておくと安心です。
Dovecotで受信箱と認証を用意する
Dovecot は IMAP でメールボックスを提供し、Postfix の SMTP 認証も肩代わりします。
sudo apt install dovecot-imapd
以下は Dovecot 2.3 系の書式です。Dovecot 2.4 では設定項目名が大きく変わったため、2.4 を使うディストリビューションでは公式ドキュメントの移行ガイドに沿って読み替えてください。
# /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir
# /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = plain login
# /etc/dovecot/conf.d/10-ssl.conf
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
# /etc/dovecot/conf.d/10-master.conf の service auth 内
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
unix_listener のパスは Postfix 側の smtpd_sasl_path = private/auth と対応しています。ここがずれていると、メールソフトから送信しようとしたときに認証エラーになります。メールアカウントは最小構成では Linux のユーザーとして作成します(sudo adduser info など)。ログイン可能なシェルを与えたくない場合は、仮想ユーザー方式への移行を検討してください。
sudo systemctl restart postfix dovecot
sudo ufw allow 25/tcp
sudo ufw allow 587/tcp
sudo ufw allow 993/tcp
DKIM署名を追加する
DKIM はメールに電子署名を付け、途中で改ざんされていないことと送信ドメインを証明する仕組みです。Ubuntu では OpenDKIM を使うのが一般的で、鍵ペアを作成し、公開鍵を selector._domainkey.example.com の TXT レコードとして公開し、Postfix から milter として呼び出す流れになります。手順が長いため詳細は下のリンク先の記事に譲りますが、DMARC を有効にするなら DKIM の導入は欠かせません。
動作確認とつまずきやすい点
設定後は次の順で確認すると、どこで止まっているかを切り分けやすくなります。
sudo postfix checkとpostconf -nで設定の誤りがないか確認するopenssl s_client -starttls smtp -connect mail.example.com:587で TLS の証明書が正しく返るか確認する- メールソフトで IMAP(993番)と SMTP(587番、STARTTLS、パスワード認証)を設定し、自分宛てに送受信する
- Gmail など外部アドレスに送り、受信側でヘッダーを表示して SPF・DKIM・DMARC が「pass」になっているか確認する
問題が起きたときは、まず /var/log/mail.log(環境によっては journalctl -u postfix)を見ます。Connection timed out が外部宛てで出るなら25番の遮断、SASL authentication failed なら Dovecot の認証設定、Relay access denied ならリレー制限か認証の未設定が原因であることが多いです。外部から届かない場合は MX レコードと受信側の25番ポートを疑います。
運用面では、不正ログインの総当たりを防ぐ fail2ban の導入、OS とパッケージの定期更新、自分の IP がブラックリストに載っていないかの定期確認が必要です。
WordPressから送信する場合
WordPress はそのままだと PHP の mail() 経由で送信するため、構築したサーバーを使うには SMTP 送信に切り替えます。「WP Mail SMTP」などの SMTP プラグインで、ホストに mail.example.com、ポート587、暗号化に TLS、送信専用に作ったアカウントの認証情報を設定する形です。プラグインの項目名はバージョンで変わるため、目的(ホスト・ポート・暗号化・認証)で照らし合わせてください。パスワードはデータベースに平文で残さないよう、プラグインが対応していれば wp-config.php の定数で指定する方法を選ぶとより安全です。
まとめ
- 自前のメールサーバーには Postfix・Dovecot・TLS・DNS 認証(SPF/DKIM/DMARC)・逆引きの5点がそろって初めて実用になる
- 構築前に、VPS 事業者の25番ポートの扱いと逆引き設定の可否を確認する
- オープンリレーを防ぐリレー制限と、暗号化接続でのみ認証を受け付ける設定は最初に入れる
- DMARC は
p=noneで始め、レポートを見ながら段階的に強める - WordPress の通知メールだけが目的なら、外部の送信サービスを SMTP で使う方法も検討する