write ahead log

ロールフォワード用

Postfixで受けたメールをスクリプトで処理したい

メールを受けたら内容を自動解析してほしいとかたまにあるやつ。

Postfixの設定

alias機能を使うとできるらしい。

sudo vi /etc/postfix/main.cf

とりあえずこんな感じにしてみる。

下2行のalias設定の有効化が大事。

myhostname = mail.hogehoge.com
mydomain = hogehoge.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4 
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases

次にaliasを設定。

vi /etc/postfix/aliases

foo@hogehoge.comへ来たメールを/home/foo/script/mail_hook.phpに処理させる。

foo: foo,|"/usr/bin/php /home/foo/script/mail_hook.php"

設定ファイルを書いたら以下のコマンドで反映する。

newaliases

解析処理

PHPでやる。ほかの言語でもライブラリさえ探せば似たようなモノだと思う。

よいライブラリがあるのでありがたく使う。

github.com

公式の記載通り、Ubuntuでは以下のようにphp-mailparseが必要。

sudo apt install php-mailparse

RedHat系でも以下で入れられる。

dnf install php-mailparse

書くまでもないけどcomposerでライブラリを入れる。

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

あとはこんなコードを書くとそれっぽくできる。

細かいことは公式を見ればOK。

<?php
require_once __DIR__.'/../vendor/autoload.php';

// 保存先
$save_dir = '/home/path/to';

// =============================
// 標準入力からメールをもらって解析する
// =============================
$parser = new PhpMimeMailParser\Parser();
$parser->setStream(fopen("php://stdin", "r"));

// =============================
// fromを取得
// =============================
$from_addrs = $parser->getAddresses('from');
$from = $from_addrs[0]['address'];

// =============================
// 保存する
// =============================
// bodyを保存する
$text = $parser->getMessageBody('text');
file_put_contents($save_dir.'/body.txt', $text);

// 添付ファイルを保存する
$parser->saveAttachments($save_dir.'/', false);

レンタルサーバーでも設定できるらしい

Xserverでやった人

XSERVER : メール受信をトリガーにして処理を起動 | R-Y-O の IT 備忘録 Ver.2.0

さくらでやった人

さくらのレンタルサーバでメール受信時にスクリプトを起動させる設定メモ - 風柳メモ

参考

GitHub - php-mime-mail-parser/php-mime-mail-parser: A fully tested email parser for PHP 8.0+ (mailparse extension wrapper).

postfix :: aliases (エイリアス) の設定 [Tipsというかメモ]