phpでメールを受け取り処理をする
2016年10月19日 17時30分
今更感が強いですがやる度に調べてる感じがしたのでメモ。
メールをパースするのにphp-mime-mail-parser/php-mime-mail-parserが便利なのでインストール。
1 |
composer require php-mime-mail-parser/php-mime-mail-parser |
もし下のエラーが発生した場合はエクステンションが足りないのでyum等でインストールする必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ composer require php-mime-mail-parser/php-mime-mail-parser Problem 1 - Installation request for php-mime-mail-parser/php-mime-mail-parser ^2.5 -> satisfiable by php-mime-mail-parser/php-mime-mail-parser[2.5.0]. - php-mime-mail-parser/php-mime-mail-parser 2.5.0 requires ext-mailparse * -> the requested PHP extension mailparse is missing from your system. ; 別途エクステンションをインストール $ sudo yum install --enablerepo=epel,remi-php70 -y php-pecl-mailparse $ composer require php-mime-mail-parser/php-mime-mail-parser Using version ^2.5 for php-mime-mail-parser/php-mime-mail-parser ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) - Installing php-mime-mail-parser/php-mime-mail-parser (2.5.0) Downloading: 100% |
MTA側も設定します。今回はpostfixです。
直接コマンドをaliasに記述することも可能ですが実行ユーザがnobodyになってしまうので一番簡単な実行ユーザを変える方法としてincludeを使用します。
下の例ではnotice宛にメールを受け取ると/path/to/commandの所有者でコマンドが実行されます。
/etc/alias
1 2 |
... notice: :include:/path/to/command |
includeを使用するためにはconfigでincludeを許可する必要があります。
/etc/postfix/main.cfに以下の設定を追加します。
1 |
allow_mail_to_commands = alias,forward,include |
実際のコマンドは/path/to/commandの中に記述します。
1 |
"| /usr/bin/php /path/to/command.php >> /path/to/command/log/command.log" |
php側ではstdinにメール内容が入ってくるのでそれを処理
1 2 3 4 5 6 7 |
$parser = new PhpMimeMailParser\Parser(); $parser->setStream(fopen("php://stdin", "r")); // 本文取得 $parser->getMessageBody(); // https://github.com/php-mime-mail-parser/php-mime-mail-parser に大体書いてある |
絵文字とか文字コードとかはかなり制限された内容だったので今回は関係なかったので特にハマる場所無し。