読者です 読者をやめる 読者になる 読者になる

Web言語のお勉強~ど素人が往く~

かつてVB6を1年くらい触った事があるだけのど素人がWeb言語に挑戦します。勉強結果を随時発表します。

【PHP】メール本文を受け取り解析する


参考にしたサイト

まずはこちらのサイト。

マルチパートなメールを解析する PEAR::Mail::mimeDecode をラップするクラス - お前の予定!! 日記

マルチパートまで対応しているようですが、とりあえずは単純テキストメールが受け取れればと。
参考にしつつ書いたのが下記。

<?php
    // 件名を取得
    $subject = mb_convert_encoding($structure->headers['subject'], "UTF-8", "jis");


    // 本文を取得
    switch (strtolower($structure->ctype_primary))
    {
        case "text":
            $body = mb_convert_encoding($structure->body, "UTF-8", "jis");
            break;
        case "html":
            $body = mb_convert_encoding($structure->body, "UTF-8", "jis");
            break;
        default:
            $body = "";
    }
?>

これで取り敢えずメール件名とメール本文を受け取れた。

最終的には下記のサイトのまとめと近い形かな、と。

メール受信時に PHP スクリプトを起動して自動処理させる方法 | PHP | 阿部辰也のブログ――人生はひまつぶし。

ほぼこんな感じになっています。

<?php
#-- PEAR の Mail/mimeDecode.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"; 
$mail_data = Mail_mimeDecode::decode($params); 

#-- From フィールドの取得
$FromAddress = $mail_data->headers['from']; 

#-- To フィールドの取得
$ToAddress = $mail_data->headers['to']; 

#-- Subject フィールドの取得
$Subject = $mail_data->headers['subject'];
$Subject = mb_convert_encoding($Subject,"UTF-8","JIS");

#-- 本文の取得
$MailBody = $mail_data->body;
$MailBody = mb_convert_encoding($MailBody,"UTF-8","JIS");
?>

これらから必要な情報を抜き出して、DBにINSERTします。

メール本文を配列に格納

メール本文を「改行テキストを配列に変換する」事でまずは操作しやすく変換します。

PHP - 改行テキストを配列に変換する - Qiita

<?php
$array = explode("\n", $text); // とりあえず行に分割
$array = array_map('trim', $array); // 各要素をtrim()にかける
$array = array_filter($array, 'strlen'); // 文字数が0のやつを取り除く
$array = array_values($array); // これはキーを連番に振りなおしてるだけ
?>

そして配列の回数分ループさせ、必要なタイミングのみDBにインサートする、と。

本当はfor派

ループはforで回すのが好きです。
でもPHPではforeachで回すのがスタンダードの様です。

PHP 配列を回すならforかforeachか - Shin x blog

という訳でforeachで回したいと思います。

<?php
    foreach ($array as $value)
    {
        // ループ内処理
    }
?>

TABLE枠組み参考用

列1 列2 列3 列4 列5
内容1 内容2 内容3 内容4 内容5

全角英数字を半角英数字に

誤り

<?php
        // 全角数字を半角数字に変換
        $value = mb_convert_kana($value, 'rns');
?>

正しくは

<?php
        // 全角数字を半角数字に変換
        $value = mb_convert_kana($value, 'rns', 'UTF-8');
?>

また、ドハマリしてしまいました(-_-;

以前この記事で解決していたのに忘れてました(^-^;

ファイルへの追記

テキストファイルに送信してきたメールアドレスを保持したいのですが、追記できず上書きされます(T_T)

<?php
file_put_contents('mail.txt', $mail);
?>

うぅむ。

PHP関数 - 文字列をファイルに書き込む - file_put_contents() - PHP入門のカルマ

第三引数に「FILE_APPEND」を記述すればよかったようです(^-^)w

<?php
file_put_contents('mail.txt', $mail, FILE_APPEND | LOCK_EX);
?>

PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)

PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)

PHPの現在時刻取得

PHPスクリプト講座:現在時刻の表示 | そふぃのphp入門

ソースは下記。

<?php
    echo date("Y/m/d G:i:s");
?>

出力は

 2015/06/09 16:10:25

の様に出力される。

SQL文

ソート順の指定。

SQL ORDER BY - 1Keydata SQL入門


SELECT "フィールド名"
FROM "テーブル名"
[WHERE "条件"]
ORDER BY "フィールド名" [ASC, DESC];

さっきエラーになるなぁと思ったら「DESK」と書いていた・・・。
正しくは「DESC

BASIC認証の導入

ある特定のPHPファイルにだけアクセス制限を掛けたい!
参考にしたのは下記!

ログイン画面が危ない!WordPressの「wp-login.php」をBASIC認証でアクセス制限する方法

<File>タグで個別に指定する事で特定のPHPファイルにだけアクセス制限を掛けられる!

<Files wp-login.php>
:
:
</Files> 

これは便利ですね~(^-^)w