blog
← Blog一覧
ubuntu / OpenSMTPD 2026-07-01

シンクラウドVPSにOpenSMTPDでメールサーバーを構築する手順

シンクラウドVPSにOpenSMTPDでメールサーバーを構築する手順

この記事はこんな人向けです

  • 前回の記事でVPS初期設定が完了した方
  • 自分のドメインでメールの送受信をしたい方
  • メールサーバーの仕組みをひと通り理解したい方

環境は Ubuntu on シンクラウドVPS、ドメインは sa-3.me を例に進めます。


はじめに:構成の概要

今回構築するメールサーバーの構成は以下のとおりです。

項目 内容
MTAソフトウェア OpenSMTPD
受信ポート 25番(TLS対応)
送信ポート 587番(STARTTLS + SMTP AUTH必須)
TLS証明書 Let’s Encrypt(Nginxと共用)
DKIM署名 filter-dkimsign(セレクター: mail)
メール保存形式 Maildir(~/Maildir/

メール認証まわり(SPF・DKIM・DMARC)も合わせて設定するため、Gmailなど主要なサービスにもきちんと届くメールサーバーが完成します。


1. OpenSMTPDのインストール

sudo apt update && sudo apt install opensmtpd

インストール中に以下の設定項目が対話的に表示されます。

項目 設定値 説明
System mail name sa-3.me メールのドメイン名です。外部に公開するドメインを設定します。
Root and postmaster mail recipient sasami root・postmaster宛のシステムメールを受け取る一般ユーザーを指定します。

2. /etc/mailname の作成

デフォルトではホスト名(x162-43-79-10 など)がメールアドレスのドメインとして使われてしまいます。/etc/mailname を作成して正しいドメインを指定します。

# メールドメインとして使用するドメイン名を書き込みます
echo "sa-3.me" | sudo tee /etc/mailname

⚠️ この設定がないと From: sasami@x162-43-79-10 のような不正なアドレスになり、Gmailなどに拒否されます。


3. SMTP認証用シークレットファイルの作成

587番ポートで認証付き送信を受け付けるため、ユーザーとパスワードの対応ファイルを作成します。

# シークレットファイル用のディレクトリを作成します
sudo mkdir -p /etc/smtpd

# パスワードを暗号化します(入力内容はターミナルに表示されません)
sudo smtpctl encrypt

# シークレットファイルを作成します
# シングルクォートで囲むことで、シェルが $ を変数として解釈するのを防ぎます
echo 'sasami <暗号化されたハッシュ文字列>' | sudo tee /etc/smtpd/secrets

# パーミッションを設定します(rootとopensmtpdグループのみ読み取り可能にします)
sudo chmod 640 /etc/smtpd/secrets
sudo chown root:opensmtpd /etc/smtpd/secrets

⚠️ smtpctl encrypt の出力には $ が含まれます。echo 時にダブルクォートで囲むとシェルが変数として解釈してしまうため、必ずシングルクォートで囲んでください。


4. DKIM署名フィルターのインストール

OpenSMTPD専用のDKIM署名フィルターをインストールします。OpenDKIMよりもシンプルで、OpenSMTPDと直接連携できます。

sudo apt install opensmtpd-filter-dkimsign

4-1. DKIM鍵ペアの生成

# 鍵の保存用ディレクトリを作成します
sudo mkdir -p /etc/opendkim/keys/sa-3.me

# RSA鍵ペアを生成します(-s でセレクター名を指定します)
sudo opendkim-genkey -D /etc/opendkim/keys/sa-3.me/ -d sa-3.me -s mail

# 秘密鍵の所有者をopensmtpdユーザーに変更します
sudo chown opensmtpd:opensmtpd /etc/opendkim/keys/sa-3.me/mail.private
sudo chmod 640 /etc/opendkim/keys/sa-3.me/mail.private

4-2. DNSに登録する公開鍵の確認

# このファイルの内容をDNSのTXTレコードに登録します
sudo cat /etc/opendkim/keys/sa-3.me/mail.txt

⚠️ mail.private(秘密鍵)は絶対に公開しないでください。mail.txt(公開鍵)はDNSに公開するために生成されたものです。


5. smtpd.conf の設定

/etc/smtpd.conf を以下の内容に書き換えます。

sudo nano /etc/smtpd.conf
#-----------------------------------------------
# テーブル定義
# エイリアステーブルと認証用シークレットテーブルを読み込みます。
#-----------------------------------------------
table aliases file:/etc/aliases
table secrets file:/etc/smtpd/secrets

#-----------------------------------------------
# PKI(TLS証明書)設定
# Let's Encryptの証明書と秘密鍵を指定します。
#-----------------------------------------------
pki sa-3.me cert "/etc/letsencrypt/live/sa-3.me/fullchain.pem"
pki sa-3.me key  "/etc/letsencrypt/live/sa-3.me/privkey.pem"

#-----------------------------------------------
# DKIMフィルター設定
# 送信メールにDKIM署名を付与します。
# selectorはDNSに登録したもの(mail)と一致させます。
#-----------------------------------------------
filter "dkimsign" proc-exec "filter-dkimsign -d sa-3.me -s mail -k /etc/opendkim/keys/sa-3.me/mail.private"

#-----------------------------------------------
# リスナー設定
# 25番ポート:外部からのメール受信用(TLS対応)
# 587番ポート:認証付き送信用(STARTTLS必須・SMTP AUTH必須)
#-----------------------------------------------
listen on 0.0.0.0 port 25  tls pki sa-3.me
listen on 0.0.0.0 port 587 tls-require pki sa-3.me auth <secrets>

#-----------------------------------------------
# アクション定義
# local:ローカルユーザーのMaildirに配送します。
# relay:DKIMフィルターを通してから外部へ直接配送します。
#-----------------------------------------------
action "local" maildir alias <aliases>
action "relay" relay filter "dkimsign"

#-----------------------------------------------
# マッチルール(上から順に評価されます)
# 1. sa-3.me宛のメールはローカル配送します。
# 2. 認証済みユーザーからの送信は外部にリレーします。
#-----------------------------------------------
match from any for domain "sa-3.me" action "local"
match auth from any for any action "relay"

設定の構文チェックと再起動

# 構文チェックを行います(エラーがなければ "configuration OK" と表示されます)
sudo smtpd -n

# OpenSMTPDを再起動します
sudo systemctl restart opensmtpd

# 動作状態を確認します
sudo systemctl status opensmtpd

6. DNSレコードの設定

XserverのDNS管理パネルで以下のレコードを追加します。メール配送の信頼性を高めるために、4種類すべて設定することを強くおすすめします。

6-1. MXレコード(メール受信用)

ホスト名 種別 内容 TTL 優先度
sa-3.me MX sa-3.me 3600 10

MXレコードは、外部のメールサーバーが「このドメイン宛のメールをどこに送ればいいか」を調べるためのレコードです。既存のAレコード(sa-3.me → VPSのIP)を指しているため、追加のAレコードは不要です。

6-2. SPFレコード(送信ドメイン認証)

ホスト名 種別 内容 TTL
sa-3.me TXT v=spf1 ip4:VPSのIPアドレス -all 3600

SPFは「このドメインから送信できるIPアドレス」を宣言するレコードです。-all は指定したIP以外からの送信をすべて拒否することを意味します。

6-3. DKIMレコード(電子署名)

ホスト名 種別 内容 TTL
mail._domainkey.sa-3.me TXT v=DKIM1; h=sha256; k=rsa; p=<公開鍵> 3600

<公開鍵> の部分は、手順4-2で確認した mail.txt の内容から p= 以降の値を使用します。

DKIMは送信メールに電子署名を付与し、受信側がその署名をDNSの公開鍵で検証する仕組みです。メールが改ざんされていないことを証明します。

6-4. DMARCレコード(認証ポリシー)

ホスト名 種別 内容 TTL
_dmarc.sa-3.me TXT v=DMARC1; p=quarantine; rua=mailto:sasami@sa-3.me 3600

DMARCはSPF・DKIMの結果をもとに「認証失敗したメールをどう扱うか」のポリシーを宣言します。p=quarantine は迷惑メールフォルダに隔離することを意味します。運用が安定したら p=reject(完全拒否)への変更を検討してください。

DNS反映確認コマンド

# MXレコードを確認します
dig MX sa-3.me @8.8.8.8

# SPFレコードを確認します
dig TXT sa-3.me @8.8.8.8

# DKIMレコードを確認します
dig TXT mail._domainkey.sa-3.me @8.8.8.8

# DMARCレコードを確認します
dig TXT _dmarc.sa-3.me @8.8.8.8

7. ファイアウォール設定

7-1. シンVPSパケットフィルター

VPSパネルの「パケットフィルター設定」から以下のポートを開放します。

ポート プロトコル 用途
25 TCP 外部からのメール受信(SMTP)
587 TCP 認証付きメール送信(Submission)

7-2. Ubuntu の ufw設定

# 25番ポートを開放します(外部からのメール受信用)
sudo ufw allow 25/tcp comment 'メール受信'

# 587番ポートを開放します(認証付き送信用)
sudo ufw allow 587/tcp comment '認証付き送信'

# 設定を確認します
sudo ufw status

8. 動作確認

送信テスト

# 外部アドレス宛にテストメールを送信します
echo "テストメールです" | sendmail your-address@gmail.com

# ログを確認します(直近20件を表示します)
sudo journalctl -u opensmtpd -n 20 --no-pager

成功時はログに以下のように表示されます。

result="Ok" stat="250 2.0.0 OK"

受信テスト

外部アドレスから sasami@sa-3.me 宛にメールを送り、以下で受信を確認します。

# 新着メールの一覧を確認します
ls -la ~/Maildir/new/

# メールの内容を表示します(<ファイル名>は上のlsで確認したものを使います)
cat ~/Maildir/new/<ファイル名>

# 受信をリアルタイムで監視します(3秒ごとに更新されます)
watch -n 3 'ls -la ~/Maildir/new/'

まとめ

これでシンクラウドVPS上にOpenSMTPDを使ったメールサーバーが構築できました。構成をまとめると以下のとおりです。

項目 内容
MTAソフトウェア OpenSMTPD
受信ポート 25番(TLS対応)
送信ポート 587番(STARTTLS + SMTP AUTH必須)
TLS証明書 Let’s Encrypt(Nginxと共用)
DKIM署名 filter-dkimsign(セレクター: mail)
メール保存形式 Maildir(~/Maildir/
SPF v=spf1 ip4:VPSのIP -all
DMARC p=quarantine(運用安定後に p=reject 推奨)

設定のポイントをおさらいします。

  1. /etc/mailname の作成を忘れずに:これがないとホスト名がドメインになってしまいます
  2. シークレットファイルの echo はシングルクォートで$ を含むハッシュ値がシェルに解釈されます
  3. DNSの4レコード(MX・SPF・DKIM・DMARC)をすべて設定する:どれか欠けると迷惑メール判定されやすくなります
  4. コントロールパネルとufwの両方でポート開放する:前回の記事と同様、両方の設定が必要です