質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

0回答

622閲覧

postfixからDB接続したい

entaro12345

総合スコア75

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

2クリップ

投稿2020/09/24 03:01

編集2020/10/05 02:30

前提・実現したいこと

AWS上に新設したサーバーにpostfixを構築しました。
postfixでメールを受信した際に、受信した内容をDBに格納したいのですが、
DB接続でエラー発生してしまいうまくいきません。
※postfixで受けた場合、下記のPHPを実行しています。

お力を貸してください。

発生している問題・エラーメッセージ

下記PHP実行時に出力している「/tmp/error.txt」の中身

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 // 送信者メールアドレス取得 16 $from = $structure->headers['from']; 17 $subject = $structure->headers['subject']; 18 19 // 署名付きの場合 20 preg_match("/<.*>/", $from, $str); 21 if ($str[0]!= "" ) { 22 $str = substr($str[0], 1, strlen($str[0]) -2); 23 $from = $str; 24 } 25 26 // DB情報セット 27 $dsn = 'mysql:dbname=DB名;host=ホスト名'; // mysqlを使用 28 $pass = 'XXXXX'; // パスワード 29 $user = 'XXXXX'; // ユーザー名 30 $now = date( 'Y-m-d H:i:s' ); 31 // データベース処理 32 try { 33 $dbh = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 34 35 // データベースに登録 36 $sql = 'insert into receive_mail '. 37 '( '. 38 ' mail_address '. 39 ' , received_date '. 40 ') values ( '. 41 ' :ad '. 42 ' , :dt '. 43 ') '; 44 // PDOStatementクラスのインスタンス生成 45 $prepare = $dbh->prepare($sql); 46 $prepare->bindValue(':ad' , $from , PDO::PARAM_STR); 47 $prepare->bindValue(':dt' , $now , PDO::PARAM_STR); 48 49 // プリペアードステートメント実行 50 $prepare->execute(); 51 } catch (PDOException $e) { 52 $msg = $e->getMessage(); 53 // ログ出力 54 file_put_contents('/tmp/error.txt', $msg, FILE_APPEND | LOCK_EX); 55 exit; 56 } 57?>

試したこと

「/etc/my.cnf」へ追記してみましたが、変わらずでした。
※設定が反映されていることは確認しました。

[client] default-character-ser=utf8 [mysql] default-character-set=utf8 [mysqld] collation-server=utf8_general_ci character-set-server=utf8

show variables like 'char%'の結果になります↓↓
show variables結果

補足情報(FW/ツールのバージョンなど)

Apache2.4
PHP7.4
MySQL8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2020/09/24 03:26

追記後mysqldは再起動しましたか?
entaro12345

2020/09/24 03:51

コメントありがとうございます。 記述漏れですみません。 はい、「sudo systemctl restart mysqld.service」コマンドはたたきました。
yu_1985

2020/09/24 05:59 編集

設定反映の確認はされたということですが、念の為mysqlに直接ログインして SHOW VARIABLES like "char%"; を実行した結果を貼ってみてもらってもいいですか
entaro12345

2020/09/24 06:13

かしこまりました! 追記いたします。
yu_1985

2020/10/06 05:40

おそらくこれで解消するであろうと思われる対策をして効果がないようなので、念の為の確認ですが、phpで接続しようとしているMySQLサーバと今回設定を行ったMySQLサーバは確実に同じものですか? おそらくローカルのMySQLサーバに対して設定変更を行ったものと思いますが…。
entaro12345

2020/10/06 23:31

コメントありがとうございます。 確実に同じものになります。 また、変数「$from $now」を直書きして直接ファイル実行すると問題なくInsertできることは確認できております。 postfixの権限等なのか設定なのか・・・その辺かなと思ってます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問