LoginSignup
9
21

More than 5 years have passed since last update.

受信したメールをPHPで解析してDBに格納する

Last updated at Posted at 2019-03-29

はじめに

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

9
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
21