前提・実現したいこと
linux上にpostfixで環境構築をしました。
やりたいことは下記になります。
メール受信したら、
①送信元メールアドレスをDBにInsert[MySQL - mailテーブル]
②送信元メールアドレスがDBに登録済みか確認[MySQL - registテーブル]
③メールを送信(登録済み or 未登録の旨が本文となります。)
少し調べたところ、postfixからMySQL接続するためには、設定が必要だということらしいのですが、
単純にPHPファイル実行で上記の①~③を実行することは不可能なのでしょうか。
発生している問題・エラーメッセージ
試しに、PHPを実行したところ、下記のメッセージが表示されました。
SQLSTATE[HY000] [2054] Server sent charset unknown to the client. Please, report to the developers
該当のソースコード
PHP
1<?php 2 // 受信メール解析 3 require_once('Mail/mimeDecode.php'); 4 5 mb_language("Japanese"); 6 mb_internal_encoding("UTF-8"); 7 8 $params['include_bodies'] = true; 9 $params['decode_bodies'] = true; 10 $params['decode_headers'] = true; 11 $params['input'] = file_get_contents('php://stdin'); 12 13 $structure = Mail_mimeDecode::decode($params); 14 15 $from = $structure->headers['from']; 16 $subject = $structure->headers['subject']; 17 18 // 署名付きの場合 19 preg_match("/<.*>/", $from, $str); 20 if ($str[0]!= "" ) { 21 $str = substr($str[0], 1, strlen($str[0]) -2); 22 $from = $str; 23 } 24 25 // DB情報 26 $dsn = 'mysql:dbname=TABLE;host=ホスト名'; 27 $pass = 'パスワード'; 28 $user = 'ユーザー名'; 29 30 try { 31 $dbh = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 32 33 $sql = 'insert into mail '. 34 '( '. 35 ' mail_address '. 36 ') values ( '. 37 ' :mail '. 38 ') '; 39 $prepare = $dbh->prepare($sql); 40 $prepare->bindValue(':mail' , $from , PDO::PARAM_STR); 41 42 $prepare->execute(); 43 44 // 登録済み確認 45 $sql = 'select '. 46 ' address '. 47 'from regist '. 48 'where 1 = 1 '. 49 ' and address = :mail '; 50 // PDOStatementクラスのインスタンス生成 51 $prepare = $dbh->prepare($sql); 52 $prepare->bindValue(':mail', $from , PDO::PARAM_STR); 53 54 // プリペアードステートメント実行 55 $prepare->execute(); 56 57 // 実行結果取得 58 $res = $prepare->rowCount(); 59 60 $regist = (0 < $res); 61 62 } catch (PDOException $e) { 63 $msg = $e->getMessage(); 64 file_put_contents('error.txt', $msg, FILE_APPEND | LOCK_EX); 65 exit; 66 } 67 68 $to = $from; 69 $sub = "登録済み確認結果"; 70 $msg = ''; 71 if ($regist) { 72 $msg = "登録済みでした。"; 73 } else { 74 $msg = "未登録でした。"; 75 } 76 $head = "From: result@xxx.xxx.xx"."\r\n"; 77 78 $sub = mb_convert_encoding($sub, 'UTF-8', 'auto'); 79 $msg = mb_convert_encoding($msg, 'UTF-8', 'auto'); 80 81 mb_send_mail($to, $sub, $msg, $head); 82?> 83
試したこと
DB接続処理部分をコメントアウトして、実行するとメール受信できることは確認しました。
補足情報(FW/ツールのバージョンなど)
PHP7.2
MySQL8
あなたの回答
tips
プレビュー