msmtp/stunnelを使ってqmailを587(submission)ポートに対応させる方法

メールサーバーqmailを運用する上で、submissionポート(587番ポート)対応は現代のメール配信において避けて通れない課題となっています。特にTLS暗号化通信が標準となった今日、従来の25番ポートだけでは安全なメール送信が困難になっています。
本記事では、qmailでsubmissionポートを活用するための具体的な設定方法と、外部TLSラッパーを用いた暗号化通信の実現方法を解説します。特にBlastengineなどの外部SMTPサービスとの連携も視野に入れた実用的な設定例をご紹介します。
なぜ submission ポート対応が必要か
近年、メールセキュリティの強化に伴い、多くのプロバイダやVPS環境では標準SMTPポート(25番)が制限されるようになりました。これにより、qmailなどからメール送信ができなくなるトラブルが発生しています。
この問題を解決するのが587番ポート(submissionポート)対応です。
blastengineなどの商用SMTPリレーサービスでは、TLS暗号化やSMTP認証が必須要件となっていることがほとんどです。これらの要件に対応しないと、メール配信の信頼性が著しく低下し、重要なメッセージが届かない事態を招きかねません。
qmailを現代のメール環境で効果的に運用するためには、submissionポート対応が不可欠なのです。
qmail の標準構成では TLS に非対応
qmail は軽量で信頼性の高いMTAとして長年使われてきましたが、標準構成ではTLS(Transport Layer Security)による暗号化通信に対応していません。これは、qmail 1.03が最終リリースされた1998年当時、電子メールにおける暗号化通信の標準がまだ広く普及していなかったことが背景にあります。
現在では、submissionポート(587番)での通信にTLSが強く推奨されており、事実上必須の要件になっています。qmailをそのまま使うと、平文での送信となり通信が傍受されるリスクを抱えることになります。この制限を克服する方法は大きく分けて2つあります。
- 外部のTLSラッパーツール(msmtp や stunnel など)を導入する
- TLS対応パッチを適用した派生版qmailを利用する
msmtpやstunnelを組み合わせれば、qmailに手を入れずとも比較的簡単にTLS+認証対応を実現できるのがメリットです。
submissionポート対応の方法(外部TLSラッパー活用)
qmail-remote 自体は STARTTLS に対応していないため、外部 TLS ラッパーを活用することで submission ポート(587番)への安全な接続を実現できます。代表的な手段としては、msmtp と stunnel の2つがあります。
- msmtp
TLS対応のSMTPクライアントとして動作し、qmail-remoteの代わりにメールを転送する - stunnel
qmailからの平文通信を受け取り、暗号化して外部SMTPサーバーへ中継する
この方法の最大の利点は、qmail本体に手を加えることなくTLS対応が可能になる点です。設定も比較的シンプルで、既存のqmail環境を大きく変更せずに導入できます。また、これらのツールは広く使われており、多くの情報やサポートが得られるという安心感もあります。
ここからは具体的な実装方法としてmsmtpとstunnelの二つの方法について詳しく解説していきます。どちらの方法も独自の利点があるため、システム環境や運用方針に合わせて選択するとよいでしょう。
方法1:msmtp を使用する
msmtpは軽量で設定が簡単なSMTPクライアントです。TLS対応が標準で組み込まれており、qmail-remoteの代替として動作させることができます。
1,msmtpのインストール
パッケージマネージャーを使ってmsmtpをインストールします。
apt install msmtp msmtp-mta
2,msmtp設定ファイルの作成
/etc/msmtprcファイルを作成し、blastengine用の設定を記述します。
cat >/etc/msmtprc <<'EOF'
# msmtp configuration for BlastEngine
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log
# BlastEngine account
account blastengine
host smtp.engn.jp
port 587
from contact@example.com
user USERNAME
password PASSWORD
# Set default account
account default : blastengine
EOF
権限を忘れずに設定します。
chmod 600 /etc/msmtprc
3,qmail-remoteのラッパー作成
qmail-remoteのラッパーを作成します。まずはオリジナルのqmail-remoteのバックアップを取りましょう。
mv /var/qmail/bin/qmail-remote /var/qmail/bin/qmail-remote.orig
新しいqmail-remoteラッパーを作成します。USERNAMEは自分のユーザー名に置き換えてください。
cat >/var/qmail/bin/qmail-remote <<'EOF'
#!/bin/bash
HOST="$1"
PORT="$2"
SENDER="$3"
RECIPIENT="$4"
# TLSポート(587/465)の場合はmsmtpを使用
if [ "$PORT" = "587" ] || [ "$PORT" = "465" ]; then
exec /usr/bin/msmtp --host="$HOST" --port="$PORT" \
--auth=on --user=USERNAME --from="$SENDER" \
--tls=on --tls-starttls=on -- "$RECIPIENT"
else
# 標準ポートの場合は元のqmail-remoteを使用
exec /var/qmail/bin/qmail-remote.orig "$@"
fi
EOF
最後に権限を設定しましょう。
chmod 755 /var/qmail/bin/qmail-remote
これでqmail-remoteのラッパーが出来ました。
4,SMTP AUTH パッチ適用
SMTP AUTHが未適用の場合はパッチを当てましょう。本記事で使用しているsagredo-qmailの場合は、既にSMTP AUTH対応済みです。パッチを適用できたら/var/qmail/control/smtproutesに以下を記述します。
:smtp.engn.jp:587|ユーザーID|パスワード
この設定により、すべてのメールがblastengine経由で送信されます。注意点として、パッチやディストリビューションによって記述法が異なる場合がありますのでドキュメントなどを確認した上で記述しましょう。
5,テスト
ラッパーが出来たら動作確認します。以下のコマンドを実行し、まずqmailctlを再起動させます。
qmailctl restart
次に以下のコマンドで簡単なテストメールを送信します。example_to@example.com(宛先アドレス)、example_from@example.com(送信元アドレス)は適当な物に差し替えてください。
echo "to:example_to@example.com" | /var/qmail/bin/qmail-inject -f example_from@example.com
次に以下のコマンドで配送ログを確認します。
tail -f /var/log/qmail/current
msmtp方式の場合は追加で以下のログも確認:
tail -f /var/log/msmtp.log
成功すると以下のようなログが表示されます。
2025-07-24 12:23:42
host=smtp.engn.jp
tls=on
auth=on
user=ユーザーID
from=example_from@example.com
recipients=example_to@example.com
mailsize=207
smtpstatus=250
smtpmsg='250 2.6.0 Message received'
exitcode=EX_OK
qmail側で”delivery 123: success: …”などが表示されたら送信成功です。
方法2:stunnel で中継する
次にstunnelを利用してsubmissionポート(587番)へ中継する方法を解説します。qmail自体はTLSに非対応ですが、stunnelを組み合わせることで平文通信を暗号化し、外部SMTPへ安全にリレーできます。
1,stunnel パッケージを導入
まずstunnelのパッケージをインストールします。以下のコマンドを実行しましょう。
sudo apt update && sudo apt install stunnel4
echo 'ENABLED=1' | sudo tee -a /etc/default/stunnel4 # 自動起動を有効化
sudo systemctl enable --now stunnel
2,証明書ストアを確認/準備
■ OS 標準の CA バンドルを使う場合
通常は OS にあらかじめ信頼済みのルート証明書が登録されています。Deb系では /etc/ssl/certs/ca-certificates.crt、RHEL系では /etc/pki/tls/certs/ca-bundle.crt を指定すればOKです。CAfile や CApath にこれらのパスを設定します。
■ 自己署名 CA を使う場合
社内CAなどの自己署名証明書を使う場合は、ca-cert.pem を任意の場所に配置します。その上で CAfile にそのパスを明示的に指定してください。OSのバンドルには含まれないため、手動での管理が必要です。
3,stunnel設定ファイルを新規作成
stunnelの設定ファイルを新規作成します。/etc/stunnel/stunnel.confをエディタで開き、以下の内容を記述してください。
#/etc/stunnel/stunnel.conf
[smtp-client]
client = yes
accept = 127.0.0.1:2525 ; qmail が投げるローカル受付ポート
connect = smtp.example.com:587 ; リレー先と submission ポート
protocol = smtp ; STARTTLS を自動発行
verifyChain = yes ; 証明書検証を有効
CApath = /etc/ssl/certs ; 必要に応じて CAfile=/path/to/ca.pem
TIMEOUTclose = 0 ; タイムアウト対策
作成できたら以下のコマンドで権限を設定します。
sudo chown root:root /etc/stunnel/stunnel.conf
sudo chmod 600 /etc/stunnel/stunnel.conf
4,stunnel サービスを起動/再読み込み
ここまででstunnelの設定は完了です。以下のコマンドによりサービスを再起動しましょう。
sudo systemctl restart stunnel4
5,qmail の smtproutes を編集
続いてqmail側の設定をします。/var/qmail/control/smtproutesをエディタで開き、以下の内容を記述します。
example.com:127.0.0.1:2525
:127.0.0.1:2525
これで、すべての宛先がstunnel経由で配送されます。
6,SMTP AUTH 対応を確認
リレー先のSMTPが認証必須の場合、qmail-remote-authパッチなどが必要です。その上で、/var/qmail/control/smtproutes にリレー先と認証情報を記述します。
example.com:smtp.example.com:587|ユーザー名|パスワード
上記のように、行末に|で区切りながらユーザー名とパスワードを追加します。パスワードを含むため、ファイルの権限設定(例:600)にも注意してください。
7,qmail サービスを再起動
ここまで設定できたら、qmailサービスを再起動しましょう。
sudo qmailctl restart
smtproutes ファイルの設定例
smtproutesは、qmailでメール送信時にどのサーバーのどのポートを使うかを決める重要な設定ファイルです。このファイルは/var/qmail/control/smtproutesに配置し、メール配送の経路を細かく制御できます。ここからはsmtproutes ファイルの書き方について解説します。
ポート番号の指定方法
標準の25番以外を使う場合は、コロンで区切ってポート番号を明示します。
- すべてのメールを submission ポート(587番)経由にする場合:
:smtp.engn.jp:587
- IPv6アドレスを利用する場合(角括弧で囲む):
example.jp:[2001:db8::25]:2525
- stunnel経由にする場合:
:127.0.0.1:2525
認証情報の記述方法
SMTP認証を使用するには、qmail-remoteにSMTP AUTH対応のパッチが適用されている必要があります。パッチが適用されていない環境では、認証情報を記載しても単に無視されるだけで、エラーにはなりません。
認証情報は「:smtp.example.com:587 | USERNAME | PASS」のように、サーバー情報の後に”|”で区切って記述します。ユーザー名とパスワードの間も”|”で区切ります。ただし、区切り文字はディストリビューションによって異なります。sagredo-qmailでは”|”ですが、スペースやタブ区切りのディストリビューションもあります。
パスワードに空白が含まれる場合は、ダブルクォーテーションで囲む必要があります。たとえば「:smtp.example.com:587|USERNAME|PASS」のように記述します。認証情報を含むファイルのため、セキュリティの観点からファイルのパーミッションは600に設定することを強く推奨します。
TLSラッパーと組み合わせる場合の注意点
stunnelなどのTLSラッパーと組み合わせることで、より安全なメール送信環境を構築できます。この場合、qmailはローカルのstunnelに接続し、stunnelが実際のリモートサーバーとのTLS通信を担当します。
smtproutesには「:127.0.0.1:2525」のようにローカルアドレスとポート番号のみを記載します。DNS参照を避けたい場合は、stunnel側で接続先サーバーを指定し、smtproutesにはIPアドレスのみ記載する構成が有効です。
重要なのは、smtproutesとstunnel.confのポート番号を必ず一致させることです。また、使用するポートによってstunnelの設定が異なります。587ポート(STARTTLS)を使用する場合はstunnel.confに「protocol = smtp」を記載しますが、465ポート(SMTPS)を使用する場合はprotocol行は不要です。
blastengine向けの設定例
blastengineを使用する場合、まず重要な仕様を理解しておく必要があります。Blastengineはメールヘッダーの要件が厳格で、From、To、Subjectの各ヘッダーが必須となっています。設定方法は大きく分けて2つのパターンがあります。最もシンプルな設定は、直接587ポートに接続する方法です。smtproutesに「:smtp.engn.jp:587|USERNAME|PASS」と記述するだけで、すべてのメールがblastengine経由で送信されます。この方法は設定が簡単で、多くの場合はこれで十分です。
より高度なセキュリティが必要な場合は、stunnel経由での接続を検討します。まずstunnel.confに設定を記述しますが、実際の運用では最小限の設定で十分動作します。pidファイルの指定は必須で、これがないとstunnelの起動に失敗するため注意が必要です。基本的な設定として、client =yesでクライアントモードを指定し、accept=127.0.0.1:2525でローカルの待ち受けポートを、connect = smtp.engn.jp:587で接続先を指定します。protocol = smtpはSTARTTLSを使用するために必要な設定です。
対応するsmtproutesの設定は「:127.0.0.1:2525|USERNAME|PASS」となります。重要なのは、ここでのUSERNAMEとPASSもblastengineの認証情報を記述するという点です。IPアドレスは127.0.0.1と記載していても、認証情報は最終送信先であるBlastengineのものを使用します。
blastengine(ブラストエンジン)とは

ブラストエンジンは、API連携・SMTPリレーで大量のメールを高速配信することが可能です。さらに、メールサーバーを必要とせず、API経由でメールを送信する仕組みも提供しています。また、サーバーの運用やメンテナンスを行っているため、常に高いIPレピュテーションを維持しながら、安全にメールを送ることができます。blastengineの特徴は以下の通りです。
- 日本国内に99%のメール到達率
- 高速配信エンジンにより大量配信にも強い
- SPF・DKIM・DMARCなど送信ドメイン認証も対応済み
- Webhook対応でエラーをリアルタイムで通知
ブラストエンジンは各メールプロバイダーや携帯キャリアのドメインに最適化されており、大規模なネットワークを経由してメール配信を行うことで、日本国内での到達率を圧倒的に高めています。
利用料金は月額3,000円からとコストパフォーマンスにも優れており、メールだけでなく、日本語での電話サポートにも対応しています。メールアドレスの入力のみで無料トライアルが可能ですので、まずは気軽にお試しください。
動作確認とトラブル対策
メール送信設定が完了したら、実際に正しく動作するかを確認し、問題が発生した場合の対処方法を理解しておくことが重要です。ここからは動作確認の方法とトラブル対策について解説します。
openssl s_client での接続確認
TLS接続の動作確認には、openssl s_clientコマンドが非常に有効です。基本的なコマンドは「openssl s_client -starttls smtp -connect 127.0.0.1:2525 -crlf」となります。このコマンドで、stunnelやその他のTLSラッパーが正しく動作しているかを確認できます。
コマンド実行時に確認すべきポイントは3つあります。まず「CONNECTED」と表示されてTLSハンドシェイクが開始されることを確認します。次に「Verify return code: 0 (ok)」が表示され、証明書検証が成功していることを確認します。最後に「250 STARTTLS」という応答があり、STARTTLS拡張が有効になっていることを確認します。
典型的なリレー先からの拒否例と対処
メール送信時によく遭遇する問題とその対処方法を説明します。
「530 Must issue STARTTLS first」のエラーは、サーバーがSTARTTLSコマンドの発行を要求しています。stunnel使用時はstunnel.confに「protocol = smtp」を設定することで解決できます。msmtp使用時は「–tls-starttls=on」オプションを追加します。
ポート番号の混同も頻発する問題です。465番ポートと587番ポートを間違えると、TLSハンドシェイク直後に「read:errno=0」で切断されることがあります。465番ポートはSMTPS、587番ポートはSTARTTLSと、それぞれ異なるプロトコルを使用するため、正しい組み合わせで設定する必要があります。
認証情報の誤りでは「535 5.7.8 Authentication credentials invalid」というエラーが返されます。smtproutesの行末に記載したユーザー名とパスワードを再確認し、特殊文字が含まれる場合はダブルクォーテーションで囲んでいるかを確認してください。
まとめ
本記事では、qmailでsubmissionポート対応を実現するための様々な方法と設定について解説しました。TLS対応の重要性から始まり、msmtpやstunnelを活用した実装方法、smtproutesファイルの適切な設定例まで幅広くカバーしています。
特にblastengine向けの設定例も紹介しましたので、メール配信サービスとの連携も容易に行えるでしょう。実装後の動作確認方法やトラブルシューティングのポイントも押さえておくことで、安定したメール送信環境を構築できます。セキュアなメール送信環境の構築に、ぜひ本記事の内容をお役立てください。
