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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

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

Postfix

Postfixは、電子メールサーバソフトウェアで、 メールを配送するシステムMTAの一種です。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

0回答

871閲覧

postfix+MySQL+メール送信

entaro12345

総合スコア75

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

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

Postfix

Postfixは、電子メールサーバソフトウェアで、 メールを配送するシステムMTAの一種です。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2020/09/30 08:49

前提・実現したいこと

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

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

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

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

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

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

sazi

2020/09/30 10:06 編集

エラーメッセージどおりに文字コードの問題なのでしょう。 メール送信するメーラーが限定されていないなら、苦難が待ち構えてると思われます。
entaro12345

2020/09/30 10:13

コメントありがとうございます。 下記のページを参考に各設定をしたはずなのですが・・・ https://tech-it.r-net.info/program/php/243/ そもそもpostfixのパイプからの処理で一気にSQL接続とメール送信ができるのかが半信半疑になっております。 出来そうな気がするのですが、いろいろ検索してもそのような記事が見当たらずです。
sazi

2020/09/30 10:26

よく見ると、メール本文は関係ないのですね。 > DB接続処理部分をコメントアウトして、実行するとメール受信できることは確認しました。 メールとは関係なくDBに書き込みは出来ているのでしょうか?
entaro12345

2020/09/30 23:21

遅くなりすみません。 はい、メール本文、および送信に関しては問題ないです。 いえ、DB接続で詰まっている状況です。 インスタンス生成時(new PDO)に、上記のエラーが発生しております。
sazi

2020/10/01 00:15

PHP7.2が認識できる文字コードのセットにMySQL側がなっていないという事ですけど、その辺は確認されたのですか? メール云々ではなく、PHPとMySQLの接続だけの問題の様ですので、質問タイトルや質問内容でで回答を得られる機会を損失しています。
entaro12345

2020/10/01 00:35

設定したうえで、「SHOW VARIABLES like "char%";」コマンドをたたいて確認はしました。 PHPとMySQLの接続については、他のPHPファイルからは問題なく接続できていますので、そこも問題ないと思ってます。 postfixでメール受信時の処理でPHPファイルを呼んでいて、そのPHPから接続しようとするとNGになってしまっていますので、何かしら権限なのかMySQLに接続するためには「alias_maps」を変更しなくては不可能なのかがわからずで困っております。
sazi

2020/10/01 01:57

成程。理解しました。 PhPサイドの問題の様ですね。Phpには詳しくないのでお役に立てそうにありません。 他の識者の回答をお待ちください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問