SMTP送信専用サーバ構築手順

概要(Postfix + OpenDKIM + PHP)

本ドキュメントは、送信専用SMTPサーバ(Postfix)を構築し、 SPF / DKIM / DMARC を適用した上で、PHPからメール送信確認を行うまでの 完全手順テンプレートです。よくある、システムがメールを送信するが受信しない。MXレコードとして受け取らない場合、セキュリティを高めるには余分な機能をそぎ落とす必要がある。

  • メール受信しない(MX不要)
  • ユーザ不要(ログインしない)
  • 外部から利用不可
  • システム内部からのみ送信
  • マルチドメイン対応(DKIMをマルチ対応)
  • GMAIL, Ymail, Outlook, iCloud, Docomoに対してメール送信可能

正引きと逆引き

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()で十分