SMTP送信専用サーバ構築手順
概要(Postfix + OpenDKIM + PHP)
本ドキュメントは、送信専用SMTPサーバ(Postfix)を構築し、 SPF / DKIM / DMARC を適用した上で、PHPからメール送信確認を行うまでの 完全手順テンプレートです。よくある、システムがメールを送信するが受信しない。MXレコードとして受け取らない場合、セキュリティを高めるには余分な機能をそぎ落とす必要がある。
- メール受信しない(MX不要)
- ユーザ不要(ログインしない)
- 外部から利用不可
- システム内部からのみ送信
- マルチドメイン対応(DKIMをマルチ対応)
- GMAIL, Ymail, Outlook, iCloud, Docomoに対してメール送信可能
正引きと逆引き
- onep.jp (aquila.onep.jp = 150.249.211.40)
- dev.aquila.jp
dig aquila.onep.jp
;; ANSWER SECTION:
aquila.onep.jp. 300 IN A 150.249.211.40
dig -x 150.249.211.40
;; ANSWER SECTION:
40.211.249.150.in-addr.arpa. 1 IN PTR aquila.onep.jp.
通信フロー
[Linux mail / PHP] ↓ localhost:25 Postfix ↓ OpenDKIM ↓ Internet (Gmail等)
1. Postfixインストール
dnf install -y postfix
systemctl enable --now postfix
2. Postfix設定
/etc/postfix/main.cf
myhostname = smtp.onep.jp
mydomain = onep.jp
inet_interfaces = loopback-only
inet_protocols = ipv4
mynetworks = 127.0.0.0/8
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination
smtpd_sasl_auth_enable = no
smtpd_tls_security_level = may
3. OpenDKIM設定
dnf install -y opendkim
mkdir -p /etc/opendkim/keys/onep.jp
mkdir -p /etc/opendkim/keys/dev.aquila.jp
opendkim-genkey -D /etc/opendkim/keys/onep.jp -d onep.jp -s mail
opendkim-genkey -D /etc/opendkim/keys/dev.aquila.jp -d dev.aquila.jp -s mail
chown -R opendkim:opendkim /etc/opendkim
chmod 700 /etc/opendkim/keys/*
/etc/opendkim.conf
Socket inet:8891@localhost
KeyTable /etc/opendkim/KeyTable
SigningTable /etc/opendkim/SigningTable
KeyTable
mail._domainkey.onep.jp onep.jp:mail:/etc/opendkim/keys/onep.jp/mail.private
mail._domainkey.dev.aquila.jp dev.aquila.jp:mail:/etc/opendkim/keys/dev.aquila.jp/mail.private
SigningTable
*@onep.jp mail._domainkey.onep.jp
*@dev.aquila.jp mail._domainkey.dev.aquila.jp
Postfix連携
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
systemctl enable --now opendkim
systemctl restart postfix
4. DNS設定例
onep.jp(ゾーンファイル)
@ IN TXT "v=spf1 ip4:150.249.211.40 -all"
mail._domainkey IN TXT "v=DKIM1; k=rsa; p=XXXX"
_dmarc IN TXT "v=DMARC1; p=none; rua=mailto:[email protected]"
dev.aquila.jp(サブドメイン)
dev IN TXT "v=spf1 ip4:150.249.211.40 -all"
mail._domainkey.dev IN TXT "v=DKIM1; k=rsa; p=YYYY"
_dmarc.dev IN TXT "v=DMARC1; p=none; rua=mailto:[email protected]"
5. テスト送信
CLI
echo "test" | mail -s "test" [email protected]
6. PHPテストスクリプト
<strong><?php</strong>
$to = "[email protected]";
$from = '[email protected]';
$subject = "SPF/DKIM/DMARC Test mail";
$message = "Hello from PHP";
$headers = "From: " . $from . "\r\n";
$headers .= "Reply-To: " . $from . "\r\n";
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
$headers .= "Content-Transfer-Encoding: 8bit\r\n";
if (mail($to, $subject, $message, $headers, "-f " . $from)) {
echo "送信成功\n";
} else {
echo "送信失敗\n";
}
7. 確認ポイント
- SPF: pass
- DKIM: pass
- DMARC: pass
Gmailの「認証結果」を確認
8. ログ確認(トラブルシュート)
tail -f /var/log/maillog
status=sent : 正常送信 status=bounced : 配信エラー
備考
- SMTP認証は不要(ローカル専用)
- TLSは外部配送時のみ
- mail()で十分
