Postfixでメールの着弾をフックにプログラムを起動させる(php-mime-mail-parserのおまけ付き)

メール連動型のアプリケーションを作成しているとちょくちょく必要になってきます。

qmailなんかをよく使っていた頃は、ユーザーフォルダの.qmailファイルを使って行っていたのですが、postfixになって、aliasesファイルに一元化できたので色々と楽になりました。

/etc/aliases

このファイルです。

aliasesの記述方法

最後の一文を追加です。

sales:		postmaster
support:		postmaster

# trap decode to catch security attacks
decode:		root

root:		piyopiyo@monmon.jp

hogehoge:       |"php /var/fugafuga/gehageha.php"

上記例では、monmon.jp のサーバだった場合、hogehoge@monmon.jpに届いたメールをフックに /var/fugafuga/gehageha.php を起動しています。”|” を忘れずに。

aliasesを変更した場合は、以下のコマンドで再読み込みが必要です。こっちもお忘れなく。

newaliases

php-mime-mail-parserをインストール

メールのパースには最近だとphp-mime-mail-parserを使うのが楽かなぁ。

composer require php-mime-mail-parser/php-mime-mail-parser

インストールでエラーが出た。。

  Problem 1
    - Root composer.json requires php-mime-mail-parser/php-mime-mail-parser ^7.0 -> satisfiable by php-mime-mail-parser/php-mime-mail-parser[7.0.0].
    - php-mime-mail-parser/php-mime-mail-parser 7.0.0 requires ext-mailparse * -> it is missing from your system. Install or enable PHP's mailparse extension.

依存しているマルチパースライブラリが足りないみたい。

sudo apt install php-mailparse

Ubuntuの場合、これでOK。CentOSの場合は、

yum install --enablerepo=remi,remi-php74 php-pecl-mailparse

php7.4の場合は、こんな感じかなぁ。

再度、composerからインストールすると入りました。

Installing 'unzip' may remediate them.
  - Downloading php-mime-mail-parser/php-mime-mail-parser (7.0.0)
  - Installing php-mime-mail-parser/php-mime-mail-parser (7.0.0): Extracting archive
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!

phpでメールを受け取る

phpのソースはこんな感じになります。

<?php

require __DIR__.'/vendor/autoload.php';

use PhpMimeMailParser\Parser;

//ライブラリでメールをパースして
$parser = new Parser();
$parser->setStream(fopen('php://stdin', 'r'));

//こんな感じで各要素を読み込み
$to = $parser->getHeader('to');
$addressesTo = $parser->getAddresses('to');
$from = $parser->getHeader('from');
$addressesFrom = $parser->getAddresses('from');
$subject = $parser->getHeader('subject');
$text = $parser->getMessageBody('text');

//あとは自由に使うだけ♪

非ユーザーの起動ユーザーを指定

非ユーザーだった場合に、postfixでプログラムを起動する際のユーザーが指定できます。

sudo vi /etc/postfix/main.cf

最後にこの行を追加です。

default_privs = apache

apacheの部分は任意のユーザー名でOKです。
デフォルトのままだとnobodyかな。ちなみにrootは指定できません。

sudo systemctl reload postfix

ここでも変更後はリロードをお忘れなく。