はじめに
CentOS上で、メールサーバが受信したメールをPHPで解析して、内容をPostgreSQLデータベースに書き込む処理を作成したときのポイントを備忘録として残す。
メールの取り込み
Postfixで受信したメールをPHPに取り込む。
メールはPHP実行時の標準入力としてやり取りを行う。
### Postfixの設定
aliasesにメールを受信したとき起動したいPHPを記載する。
○○○○○(ドメイン無しメールアドレス): ○○○○○(メールユーザ),"| /○×□/○×□/php /○×□○×□/○×□○×□/.../○×□.php(実行したいPHP)"
【実装例:abcde@example.co.jp宛にメールを送る場合】
abcde: mailuser,"| /usr/bin/php /opt/mail.php"
PHPの記述
PHPの標準入力としてメールが受け渡される。
以下の実装例に従うと、$strMailにヘッダなどを含めメールの情報が全て入っていることになる。
【実装例】
$strMail = "";
$stdin = fopen("php://stdin", "r");
if (!$stdin){
//標準入力オープンエラー
exit();
}
while (!feof ($stdin)){
$strMail .= fgets($stdin, 4096);
}
fclose ($stdin);
メール解析
メールパーサとして「php-mime-mail-parser」を使用する。
インストールは色々試したが、composerを使うのがやっぱり安定。
【実装例】
$parser = new PhpMimeMailParser\Parser();
$parser->setText($strMail);
$subject = $parser->getHeader('subject');
$body = $parser->getMessageBody('text');
...など
更に本文の編集やチェックをする場合には自分で処理を記載する。
その他
DB接続方法はこちらを参照。
PostgreSQLのトランザクション処理
$dbh = new PDO("pgsql:host=$DBHOST;port=$DBPORT;dbname=$DBNAME;user=$DBUSER;password=$DBPASS");
【トランザクション開始】
$dbh->beginTransaction();
【トランザクション終了】
$dbh->commit();
自動採番された値の取得(SQL)
トランザクション内で採番された値ならSQLで簡単に取得可能。
【実装例1】
INSERT INTO table名(A項目, 自動採番項目) VALUES (:A項目, currval(\'XXXXXX\'))
【実装例2】
SELECT currval(\'XXXXXX\')
※XXXXXXは、nextval等で使用している名前。
プリペアドステートメント
SQL中の値をパラメータ化できる。
SQLインジェクション対策になる。
【実装例】
$dbh = new PDO("pgsql:host=$DBHOST;port=$DBPORT;dbname=$DBNAME;user=$DBUSER;password=$DBPASS");
$prepare = $dbh->prepare('UPDATE table名 SET status = :stat, ymd = :ymd');
$prepare->bindParam(':stat', $status, PDO::PARAM_STR);
$prepare->bindParam(':ymd', $ymd, PDO::PARAM_STR);
参考
参考にさせていただいた記事一覧(順不同)
感謝感激雨あられ
https://packagist.org/packages/php-mime-mail-parser/php-mime-mail-parser
http://big1to.com/development-note/661
https://qiita.com/keizokeizo3/items/37d6b03ed9234844c891
http://skill-up-engineering.com/2018/07/21/%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%91%E3%83%BC%E3%82%B5%E3%83%BCmailparse%E3%81%A8php-mime-mail-parser%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6/
https://noumenon-th.net/programming/2016/02/16/transaction/
https://bituse.info/php/37