Postfixでこうやりたいときどうする?

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

さくらのVPSにAlmaLinux9.3をインストールした覚書です。

Postfixの設定集です。
このページの内容は AlmaLinux9.3 on さくらのVPS / メールサーバ の内容で構築している前提となります。

なお本番環境で利用される場合はここにある内容だけを鵜呑みにせずセキュリティ専門家に相談されることをお勧めします。

環境

実施日2024-05-01
サーバさくらのVPS 2G
OSAlmaLinux9.3
cat /etc/redhat-release
AlmaLinux release 9.3 (Shamrock Pampas Cat)

設定反映と再起動

スクリプトにしておくと便利です。
何か設定変更があるときは対象ファイルを変更し、下記を実行します。

/root/mail/update_mailbox.sh

メールアカウントの追加

下記のファイルを編集します。

vi /root/mail/update_mailbox.php

編集した後は、設定反映と再起動を行います。

/root/mail/update_mailbox.sh

他のメールアドレスに転送する

aaa@example.com に届いたメールを bbb@example.net や ccc@example.jp に転送します。

vi /etc/postfix/virtual
aaa@example.com aaa@example.com,bbb@example.net,ccc@example.jp
「対象のメールアドレス」「スペース」「転送先1」「カンマ」 「転送先2」「カンマ」 「転送先3」・・・

自分にも残す場合は、転送先に自分を含めます。
自分に残さない場合は、転送先のみ記述します。

ワイルドカードなメールアドレス宛に転送するとき

example@example.com main@example.net,example@i.softbank.jp

「main@example.net」がワイルドカードのアドレスの「メインアドレス」とする場合です。

反映させる

ファイルを編集しただけでは切り替わりませんので下記を実行します。

/root/mail/update_mailbox.sh

更新スクリプトのうち実際に必要なのは次の2行です。こちらを手動で行っても構いません。

postmap /etc/postfix/virtual
systemctl restart postfix

メールを受信してPHPファイルを実行

空メール対応のように指定のメールアドレスに届いたらPHPなどのプログラム処理に投げるには次のようにします。

ここでは例として3パターン登録しています。

転送設定ファイルを設定します。

vi /etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport

対象のメールアドレスと実行コマンドを紐づけします。

vi /etc/postfix/transport
command1@example.com mail_controller1
command2@example.net mail_controller2
command3@example.biz mail_controller3

実行コマンドの詳細を設定します。

vi /etc/postfix/master.cf

「ユーザー名」はPHPの実行権限となるユーザーを指定します。

mail_controller1 unix  -    n    n    -    -    pipe
  flags= user=ユーザー名 argv=/usr/bin/php /home/ユーザー名/controller1.php

mail_controller2 unix  -    n    n    -    -    pipe
  flags= user=ユーザー名 argv=/usr/bin/php /home/ユーザー名/controller2.php

mail_controller3 unix  -    n    n    -    -    pipe
  flags= user=ユーザー名 argv=/usr/bin/php /home/ユーザー名/controller3.php

argv を工夫することでPHP以外にも応用できます。

実は・・・

上記で3パターンの例を書きましたが、次のようにする方法もあります。
場合によってはこちらのほうが良い場合もあります。

vi /etc/postfix/transport
command1@example.com mail_controller
command2@example.net mail_controller
command3@example.biz mail_controller

実行コマンドの詳細を設定します。

vi /etc/postfix/master.cf

「ユーザー名」はPHPの実行権限となるユーザーを指定します。

mail_controller unix  -    n    n    -    -    pipe
  flags= user=ユーザー名 argv=/usr/bin/php /home/ユーザー名/controller.php

このように受け付けるメールアドレスは複数でも、実行コマンドは「mail_controller」1つだけにします。

/home/ユーザー名/controller.php
こちらの中で、受信したメールアドレスを取得し、そこから処理を振り分けていくこともできます。
どちらが良いかはケースバイケースです。

キャッチオールなメールアドレス

「ワイルドカードのメールアドレス」ということもあります。
「@」の前がなんであるかに関わらず、1つのメールアカウントで管理したいときに使用します。

vi /etc/postfix/virtual
@a.example.com main@a.example.com
@b.example.com main@b.example.com
@c.example.com main@c.example.com

このように「〇〇@a.example.com」のようなメールアドレスならすべて「main@a.example.com」が管理しますよ、といった感じです。

「@example.com main@example.com」
このようにすることもできるのですがカオスになると思いますので、ワイルドカードにするならサブドメインを当てておくことをオススメします。

添付ファイルの制限

添付ファイルに制限をつけることができます。
添付ファイルと書いていますが、本文なども含んだメール1通の全体サイズとなります。

vi /etc/postfix/main.cf
message_size_limit = 20971520

20 x 1024 x 1024 = 20971520
20MB分の制限をする例です。
添付ファイルは10MBの制限としてたいのですが、BASE64で少し大きくなるのと本文なども含むので少し余裕をもって 20MBとしています。