📮

Webアプリからの通知に!Postfixで構築する送信専用SMTPサーバー

に公開

はじめに

ユーザー登録時の確認メール、パスワードリセットの通知、バッチ処理の完了報告など、Webアプリケーションを開発していると、サーバーからメールを送信したい場面は頻繁にあります。

外部のメール配信サービス(SendGrid, Amazon SESなど)を利用するのも一つの手ですが、「まずは手軽に、ローカルサーバーから直接メールを送りたい」というケースも多いでしょう。

この記事では、自身のWikiメモを元に、Linuxの標準的なMTA(メール転送エージェント)であるPostfixを使って、外部からのメール受信は行わない「送信専用」のSMTPサーバーを構築する手順をまとめます。

なぜ「送信専用」なのか?

通常のメールサーバーは、メールの「受信」と「送信」の両方を行います。しかし、メールを受信するためには、スパム対策やセキュリティ設定など、非常に複雑で手間のかかる管理が必要です。

一方、アプリケーションからの通知のように**「送信」さえできればよい**のであれば、設定を大幅に簡略化でき、セキュリティリスクも低減できます。

Step 1: Postfixのインストール

多くのLinuxディストリビューションではPostfixがデフォルトでインストールされていますが、もしなければyumdnfでインストールします。

sudo yum install postfix

Step 2: 設定ファイル main.cf の編集

Postfixの挙動は、/etc/postfix/main.cfというファイルで設定します。送信専用サーバーにするための重要なポイントは、サーバー自身(localhost)からのメール送信のみを受け付けるように設定することです。

以下は、送信専用サーバーとして動作させるための設定例です。

/etc/postfix/main.cf
# --- 基本設定 ---
# サーバーのホスト名 (FQDN)
myhostname = mail.example.com
# メールドメイン
mydomain = example.com
# 送信元メールアドレスの@以降を$mydomainに書き換える
myorigin = $mydomain

# --- 送信専用にするための最重要設定 ---
# 待ち受けるネットワークインターフェースをlocalhostのみに限定
# これにより、外部からのSMTP接続(25番ポート)を受け付けなくなります
inet_interfaces = loopback-only
# inet_interfaces = localhost と同じ意味

# --- その他の設定 ---
# このサーバーがメールを受信するドメイン(空にしておくと安全)
mydestination =

# メールを送信できるネットワーク(localhostのみに限定)
mynetworks = 127.0.0.0/8 [::1]/128

# ログに記録する情報の形式
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)

Step 3: サービスの起動とテストメールの送信

設定を保存したら、Postfixを起動し、OS起動時に自動で立ち上がるように設定します。

sudo systemctl start postfix
sudo systemctl enable postfix

次に、コマンドラインからテストメールを送信してみましょう。

echo "This is the body of the test email." | mail -s "Postfix Test" your-email@example.com

your-email@example.comの部分に、受信可能なあなたのメールアドレスを指定します。

メールが届かない場合は、/var/log/maillogにエラーが出力されていないか確認してください。

sudo tail -f /var/log/maillog

PHPからの利用例

Webアプリケーション(PHP)からは、標準のmail()関数を使って非常に簡単にメールを送信できます。

<?php
$to = 'recipient@example.com';
$subject = 'Test from PHP';
$message = 'This email was sent via the local Postfix server.';
$headers = 'From: webmaster@' . ini_get('sendmail_from'); // myoriginで設定したドメインが使われる

if (mail($to, $subject, $message, $headers)) {
    echo "Email sent successfully!";
} else {
    echo "Email sending failed.";
}
?>

おわりに

以上が、Postfixを使った送信専用SMTPサーバーの基本的な構築手順です。
inet_interfaces = loopback-onlyという一行の設定だけで、外部からの接続をシャットアウトし、安全な通知用メールサーバーを手軽に構築できます。

大量のメールを確実に届けたい場合は専門のメール配信サービスが適していますが、小〜中規模のアプリケーションからの基本的な通知であれば、この方法で十分対応可能です。ぜひ、あなたの開発環境に役立ててください。


この記事で紹介した内容以外にも、技術情報をブログで発信しています。
MEANTECH
https://meantech.fontfontfont.com/

Discussion