こんにちは。
BIG1等を当てたいサラリーマンです。
aliases(エイリアス)を使ってメール受信をトリガーにPHPを実行する方法を記事にします。
メールの解析に便利な、PEAR/Mail_MimeDecodeも併せて紹介します。
php-mime-mail-parserを使う方法も別エントリーで記事にしたいと思います。
パッケージ管理ツールのComposerインストール手順などもまとめたいと思います。
こちらのエントリーで構築したローカル開発環境に設定します。
もくじ
- aliases(エイリアス)とは
- main.cfの編集
- aliasesの編集
- PEARとは
- PEARパッケージマネージャーをインストール
- PEAR/Mail_MimeDecodeインストール
- PHPプログラム設置
- 送信テスト
- 参考ページ
aliases(エイリアス)とは
Sendmail用の設定ファイルですが、互換のあるPostfixでも利用できます。
メールの転送先を設定できます。この機能を応用してPHPを実行します。
main.cfの編集
viで開いて編集します。
sudo vi /etc/postfix/main.cf
以下をコメントインします。
alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases
Postfixを再起動して設定を反映させます。
sudo service postfix restart
viで開いて編集します。
aliasesの編集
sudo vi /etc/aliases
最終行に追加します。
vagrant: vagrant, "|/usr/bin/php /var/www/html/example.com/execmail.php"
vagrant宛に配送されたら、execmail.php(パイプでphpパスを渡す)を実行します。
メールは転送されるので残りません。残すために「vagrant,」も設定しています。
設定を反映させます。
sudo newaliases
PEARとは
PEAR(ペア) は、PHP Extension and Application Repositoryです。
PHPのライブラリ群と思えば良いでしょう。
今回は、PEARのMail_MimeDecodeライブラリをメールの自動返信プログラムに組み込みます。
PEARパッケージマネージャーをインストール
PEARを利用するためにパッケージマネージャーをインストールします。
sudo yum install -y php-pear
PEAR/Mail_MimeDecodeインストール
インストール
sudo pear install Mail_Mime sudo pear install Mail_mimeDecode
PHPプログラム設置
以下のソースを、/var/www/html/example.com/execmail.phpに配置します。
ソースの中身は受信したメールから送信元アドレス、件名、本文を取得し、UTF-8にエンコードを行い、logファイルに書き出す処理をします。
<?php require_once ('Mail/mimeDecode.php'); $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $params['input'] = file_get_contents('php://stdin'); // $params['crlf'] = "\r\n"; $structure = Mail_mimeDecode::decode($params); $from = $structure->headers['from']; // $to = $structure->headers['to']; $subject = $structure->headers['subject']; // エスケープ処理 // $from = addslashes($mail); // $from = str_replace('"','',$mail); // 署名付きの場合の処理を追加 preg_match("/<.*>/", $from, $str); if ($str[0]!= "" ) { $str = substr($str[0], 1, strlen($str[0]) -2); $from = $str; } switch (strtolower($structure->ctype_primary)) { case 'text': $body = $structure->body; $contenttype = CONT_TEXT; break; case 'multipart': foreach ($structure->parts as $part) { switch (strtolower($part->ctype_primary)) { case 'text': $body = $part->body; $contenttype = CONT_MULTI; break; case 'image': // 画像を取得する処理が必要な場合 $ext = strtolower($part->ctype_secondary); // if ($ext == 'jpeg' || $ext == 'jpg' || $ext == 'gif' || $ext == 'png') { // $fp = fopen('/var/www/html/images/'. time(). $ext, 'W'); // $length = strlen($part->body); // fwrite($fp, $part->body, $length); // fclose($fp); // } break; } } break; default: $body = ''; } // Convert Encoding UTF-8 $subject = mb_convert_encoding($subject, 'UTF-8', 'auto'); $body = mb_convert_encoding($body, 'UTF-8', 'auto'); // Write Text $log = "From : {$from}\nSubject : {$subject}\nBody : {$body}\n"; $fp = fopen('/var/www/html/example.com/mailphp.log', 'a'); fwrite($fp, $log); fclose($fp);
送信テスト
適当にメールを作って送信します。
正常に送受信できています。
処理されてファイルに書きだされたのが分かります。
参考ページ
PHPプロ!TIPS+