メールの活用して、情報の管理をすると、入力の場所が明確になって
わかりやすい
メールの内容を、プログラムで確認する方法として
メールの受信をトリガーにして、プログラムを起動する方法がある
以下のページを参考にして、作ってみた
・XSERVER : メール受信をトリガーにして処理を起動
https://raspi.ryo.sc/xserver-mail-trigger/
・メール受信をトリガーにして任意のプログラムを実行する
https://revolutionary.hatenablog.jp/entry/20090226/p1
・XSERVERのメールフィルタでメール転送してみよう
https://seous.info/jobs/internet/1553#google_vignette
・メール受信をトリガーにPHP発動(ネットオウル・ファイアバード)
https://ameblo.jp/tencommon/entry-11493595921.html
・メールの振り分け
https://www.xserver.ne.jp/manual/man_mail_sorting.php
まずは、簡単なプログラムとして
メール受信だけを、確認するために
PHPのプログラムで
ログファイルを書き出してみる
PHPのプログラムは
test.phpとして、logのフォルダーを作っておく
1 2 3 |
<?php $f ="./log/app_".date('Ymd_Hi')."0.log"; error_log(date('Ymd_His')."\n",3, $f); |
受取用のメールアカウントも作っておく
メールアカウントは
auto@xxxxxxxx.xsrv.jp
としておく
メールアカウントができたので、左のサイドメニューの「メールの振り分け」を選択
メールを送信して見るが、ログが吐き出さない
直接ブラウザから起動するとログを吐き出す
ログのパスをルートからのパスにしたら上手く行った
1 2 3 4 |
<?php $f ="./log/app_".date('Ymd_Hi')."0.log"; $f ="/home/xxx/xxx.xsrv.jp/public_html/auto/log/app_".date('Ymd_Hi')."0.log"; error_log(date('Ymd_His')."\n",3, $f); |
次は、せっかくメールで送られて来るので
メールの情報を取得してみよう
ページ
「メール本文を取得して本文を変更する」
https://revolutionary.hatenablog.jp/entry/20090312/p1
https://www.webdata.jp/tech/php02.php
【PHP】メールの受信
https://shiranuik.hatenablog.jp/entry/20100624/1277391796
メールを分解する。の解説。
http://www.aiwake.co.jp/modules/bulletin/index.php?page=article&storyid=4
PHP : 受信メールの添付ファイルを保存する
https://qiita.com/ga_ku/items/2f2640905f91aeb82d6c
受信したメールをPHPで解析してDBに格納する
などを参考に
PEARを使って、メールの内容を取得してみる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
require_once '/home/xxxx/xxxx.xsrv.jp/public_html/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); //送信者のメールアドレスを抽出 $mail = $structure->headers['from']; $mail = addslashes($mail); $mail = str_replace('"','',$mail); //署名付きの場合の処理を追加 preg_match("/<.*>/",$mail,$str); if($str[0]!=""){ $str=substr($str[0],1,strlen($str[0])-2); $mail = $str; } |
これで、メールの内容が取得できた
添付ファイルを、取得して、格納したいが、ファイル名の取得が必要
1 2 3 4 |
if($type != "jpeg" and $type != "jpg"){ continue; } $filename = $part->filename; |
これで、取得できた
行いたいのは、csvのファイルを、複数添付したものを、取得し処理したい
(dbへの追加アップロード)
どんなないよか調べてみる
1 2 3 4 5 6 7 8 9 10 |
case "multipart": // マルチパート(画像付き) foreach($structure->parts as $part){ $ff=$part->headers->content-disposition; $f ="/home/xxxx/xxxx.xsrv.jp/public_html/auto/log/app_".date('Ymd_Hi')."03.log"; error_log($ff, 3, $f); $result = print_r($part, true); $f ="/home/xxxx/xxxx.xsrv.jp/public_html/auto/log/app_".date('Ymd_Hi')."04.log"; error_log($result, 3, $f); |
内容を確認すると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
stdClass Object ( [headers] => Array ( [content-type] => text/csv; charset="Shift_JIS"; name="statement-102-1-1186829.csv" [content-disposition] => attachment; filename="statement-102-1-1186829.csv" [content-transfer-encoding] => base64 [content-id] => <f_m0tegpve0> [x-attachment-id] => f_m0tegpve0 ) [ctype_primary] => text [ctype_secondary] => csv [ctype_parameters] => Array ( [charset] => Shift_JIS [name] => statement-102-1-1186829.csv ) |
1 2 3 4 5 6 7 8 9 10 11 |
内容が [ctype_secondary] => csv なので、 ctype_secondaryを取得して csv で、分岐して ファイル名を [ctype_parameters] => Array ( [name] => statement-102-1-1186829.csv で、行えば良さそう |
ファイル名は
1 |
$filename=$part->ctype_parameters->name; |
でいけるはずだが、取り込めない
四苦八苦したあと
1 |
$filename=$part->ctype_parameters["name"]; |
で、取り込めた
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
<?php require_once '/home/xxxx/xxxx.xsrv.jp/public_html/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); //送信者のメールアドレスを抽出 $mail = $structure->headers['from']; $mail = addslashes($mail); $mail = str_replace('"','',$mail); //署名付きの場合の処理を追加 preg_match("/<.*>/",$mail,$str); if($str[0]!=""){ $str=substr($str[0],1,strlen($str[0])-2); $mail = $str; } /* *「$structure->headers['to']」で送信元のメールアドレスも取得できます。 */ // 件名を取得 $diary_subject = $structure->headers['subject']; switch(strtolower($structure->ctype_primary)){ case "text": // シングルパート(テキストのみ) $diary_body = $structure->body; break; case "multipart": // マルチパート(画像付き) foreach($structure->parts as $part){ switch(strtolower($part->ctype_primary)){ case "text": // テキスト $type = strtolower($part->ctype_secondary); if($type == "csv"){ $filename="test.csv"; // 固定だと上手く行く $filename=$part->ctype_parameters->name; // ->nameが取り込めない $filename=$part->ctype_parameters["name"]; // 上手く行った $length = strlen( $part->body ); fwrite( $fp, $part->body, $length ); fclose( $fp ); break; } $diary_body = $part->body; break; case "image": // 画像 //画像の拡張子を取得する(小文字に変換 $type = strtolower($part->ctype_secondary); //JPEGチェック(GIFやPNG形式の画像チェックなども可 if($type != "jpeg" and $type != "jpg"){ continue; } $filename = $part->filename; $fp = fopen("/home/xxxx/xxxx.xsrv.jp/public_html/auto/tmp/" .$filename,"w" ); $length = strlen( $part->body ); fwrite( $fp, $part->body, $length ); fclose( $fp ); break; } } break; default: $diary_body = ""; } /* * 取得したメールアドレス、タイトル、本文、画像を使用してデータベースなどに取り込む */ $f ="./app_".date('Ymd_Hi')."1.log"; $f ="./log/app_".date('Ymd_Hi')."0.log"; $f ="/home/xxxx/xxxx.xsrv.jp/public_html/auto/log/app_".date('Ymd_Hi')."0.log"; error_log($diary_subject , 3, $f); // フルパスで指定しないとダメなようだ $f ="/home/xxxx/xxxx.xsrv.jp/public_html/auto/log/app_".date('Ymd_Hi')."0.json"; error_log(json_encode($structure), 3, $f); // 添付ファイルがないと、解析ができる、ダウンロードしてFierFoxで開くと解析ができる ?> |
複数の添付ファイルを付けても、処理をしてくれた
後は、一連の操作の中で、DBへ書き込む処理を追加していく
ネット銀行(GMOあおぞら銀行)や、Stripeなどから、CSVをダウンロードして、メールで添付すると、自動的に、月次決算を集計するものにしていきたい
当面、自分だけで使うので、セキュリティ要件は緩めになっています